【问题标题】:What is __attribute__((unused)) static?什么是 __attribute__((unused)) 静态的?
【发布时间】:2019-03-11 23:58:07
【问题描述】:

libuv 文件heap-inl.h 中,我看到了以下宏

#if defined(__GNUC__)
# define HEAP_EXPORT(declaration) __attribute__((unused)) static declaration
...
HEAP_EXPORT(void heap_init(struct heap* heap));
...

heap-inl.h 包含在源文件loop.c 中,然后使用声明的函数heap_init

根据我的理解...

  • heap-inl.h 代表堆“内联”?
  • HEAP_EXPORT 正在导出一个供其他源文件使用的函数。

我不明白为什么导出的函数被标记为__attribute((unused))__。另外,为什么它也是static 声明?我认为static 函数只能在定义它的文件中使用。另外,内联与这些有什么关系?

【问题讨论】:

    标签: c gcc gnu libuv


    【解决方案1】:

    static 关键字表示该函数是编译文件的本地函数。当它在头文件中时,意味着它包含在所有编译文件中。 那么问题是如果不使用这个函数,一些编译器(clang、gcc、VS 和正确的文件)会产生一个警告。将函数标记为未使用将删除此警告(如果警告被视为错误,则可能会出现错误)。

    所以HEAP_EXPORT并不是真正导出任何东西,只是让函数可用(如果body也在header中,如果文件名为-inl就是这种情况,确实是表示内容将是内联在编译文件中)。

    【讨论】:

      【解决方案2】:

      here所述:

      unused

      附加到函数的此属性意味着该函数可能未被使用。 GCC 不会对此函数产生警告。

      此属性还有一个额外的好处,即根据情况,如果从未调用该函数,则可能根本不会发出该函数(它不会使用编译文件中的空间)。

      这通常与头库中的static 函数一起使用,因此只有实际使用的函数才会作为机器代码发出并避免警告。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        • 2010-10-16
        相关资源
        最近更新 更多