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

时间:2011-11-14 19:04:37

标签: c gcc static header inline

我发现Apple在OSAtomic.h标题中使用了以下声明:

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. 他们是否真的需要在某个库中定义此符号(以摆脱此警告)?如果只能通过调用OSAtomicAdd32创建函数OSAtomicDecrement32,为什么不能直接在头文件中定义它?他们应该使用#define OSAtomicDecrement32 ... body ..而不是?

  2. 如果我不在我的程序中调用OSAtomicDecrement32,为什么它会抱怨未定义符号OSAtomicAdd32(当我没有链接到定义它的库时)?它是内联的,我认为当我不使用某些东西时,编译器会将其剥离......

  3. 感谢您向我解释!

2 个答案:

答案 0 :(得分:1)

我猜gcc抱怨这个的原因是static关键字导致此函数的代码在任何编译单元中发出。他们不应该这样做。要么他们使用

  • 清除C99标准代码。那么他们只需要做inline没有 static并在一个库中提供符号,例如libc。
  • 使用编译器扩展,例如gcc' s(以及clang's)属性 always_inline

但从不static

顺便说一句,gcc有这个操作的扩展(前缀为__sync IIRC),可以移植到其他有gcc,clang,icc,opencc的系统......

也许你可以通过在gcc调用中添加一些参数来解决这个问题。请尝试-std=c99或关闭相应的警告。

答案 1 :(得分:0)

警告消息并未说明OSAtomicDecrement32未定义,恰恰相反。该消息告诉您有一个已定义的函数但您没有调用它。如果它来自外部库,则无需担心,如果它在您自己的代码中,那么您可能还没有编写代码来调用它。