c - 警告...已定义但未使用 - 我真的需要 .c 文件吗?

标签 c gcc static header inline

我发现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

确实如此,但我想知道以下问题的答案:

  1. 他们真的需要在某个库中定义此符号(以消除此警告)吗?如果函数 OSAtomicDecrement32 只能通过调用 OSAtomicAdd32 创建,为什么不能直接在 header 中定义它?他们应该使用 #define OSAtomicDecrement32 ...body.. 来代替吗?

  2. 如果我不在程序中调用 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/

相关文章:

c - 消息 UDP 中的文件名

linux - 剥离 libc.so.6 的 FS 寄存器

c - 如何在不使用 LD_LIBRARY_PATH 的情况下链接 makefile 中共享库的特定版本?

android - ActivityInstrumentationTestCase2和static final : fields become null after first test的使用

c - 如何在 C 中使用 switch 语句保留被操作位的值

C编程: Protected memory across fork()

c - c 中的内存损坏

python - 在 OS X 上安装 Pycurl 时出错

Java 到 Cpp 代码转换,有关 static 和 new 关键字的问题

Perl 静态类属性