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

警告已定义但未使用-我真的需要.c文件吗?,c,gcc,static,header,inline,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

我发现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
这是事实,但我想知道以下问题的答案:

  • 他们是否真的需要在某个库中定义此符号(以消除此警告)?如果函数OSAtomicDecrement32只能通过调用OSAtomicAdd32来创建,为什么不能直接在头中定义它?他们应该使用#定义OSAtomicDecrement32…body。。相反

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


  • 谢谢你给我解释

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

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

    • 清除C99标准代码。然后他们只需要做
      inline
      而不需要
      static
      并在一个库中提供符号,例如libc
    • 使用编译器扩展,比如gcc的(以及clang的)属性
      始终在线
    但决不要
    静态

    顺便说一句,gcc对此操作有扩展(前缀为
    \uu sync
    IIRC),可以移植到其他有gcc、clang、icc、opencc的系统中


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

    没错,但即使我没有使用它(没有调用它),也没有提供在链接时实现OSAtomicAdd32的库,它也不会链接解释OSAtomicAdd32未定义…@kexik这不是错误。如果它没有链接,那是因为其他错误。谢谢你的解释!如果他们使用了你提出的一个想法,那么这个功能的主体将在哪里?在前面提到的标题中还是在库中?如果在库中,内联是否会导致库中的代码内联,或者是否总是要调用此函数?如果没有
    static
    ,我想在标题中就可以了。使用符合标准的编译器,他们只需在一个编译单元中放入一个
    extern
    声明,就可以为(此处)不太可能的情况生成一个替换符号,即有时函数不能内联到它的一个用户中。