我发现Apple在OSAtomic.h header 中使用了以下声明:
inline static int32_t OSAtomicDecrement32( volatile int32_t *__theValue )
{ return OSAtomicAdd32( -1, __theValue); }
包含它并编译时,我收到以下警告:
warning: 'int32_t OSAtomicDecrement32(volatile int32_t*)' defined but not used
确实如此,但我想知道以下问题的答案:
他们真的需要在某个库中定义此符号(以消除此警告)吗?如果函数 OSAtomicDecrement32 只能通过调用 OSAtomicAdd32 创建,为什么不能直接在 header 中定义它?他们应该使用 #define OSAtomicDecrement32 ...body.. 来代替吗?
如果我不在程序中调用 OSAtomicDecrement32,为什么它会提示符号 OSAtomicAdd32 未定义(当我不链接到定义它的库时)?它是内联的,我认为当我不使用某些东西时,编译器会将其剥离......
感谢您向我解释!
最佳答案
我猜 gcc 提示这一点的原因是 static
关键字,它导致该函数的代码在任何编译单元中发出。他们只是不应该这样做。他们要么会使用
- 清晰的C99标准代码。然后他们只需要做
inline
而无需static
并仅在一个库(例如 libc)中提供符号 - 使用编译器扩展,例如 gcc 的(以及 clang 的)属性
always_inline
但绝不是静态
。
顺便说一句,gcc对此操作有扩展(前缀为__sync
IIRC),可以移植到其他有gcc、clang、icc、opencc的系统......
也许您可以通过向 gcc 调用添加一些参数来解决这个问题。尝试 -std=c99
或关闭相应的警告。
关于c - 警告...已定义但未使用 - 我真的需要 .c 文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8126714/