什么是__attribute __((unused))static?

时间:2018-10-06 20:44:06

标签: c gcc gnu libuv

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代表堆“ inline”?
  • HEAP_EXPORT正在导出一个供其他源文件使用的功能。

我不明白的是为什么将导出的功能标记为__attribute((unused))__。另外,为什么它也是static声明?我以为static函数只能在其定义的文件中使用。此外,内联函数与其中的任何内容有什么关系?

2 个答案:

答案 0 :(得分:4)

static关键字表示该函数在已编译文件本地。当它在标题中时,表示它已包含在所有编译文件中。 然后的问题是,如果不使用此功能,某些编译器(带有适当文件的clang,gcc,VS)将生成警告。将功能标记为未使用将删除此警告(如果警告被视为错误,则可能会导致错误)。

因此HEAP_EXPORT并没有真正导出任何内容,只是使函数可用(如果主体也位于标头中,如果文件名为-inl就是这种情况,这实际上是表明内容将内联到已编译的文件中。

答案 1 :(得分:1)

here所述:

  

unused

     

此属性,附加到函数上,意味着该函数可能未被使用。 GCC不会对此功能发出警告。 GNU C ++当前不支持该属性,因为没有参数的定义在C ++中有效。

此属性还具有附加的优点,根据情况,如果从不调用该函数,则该函数可能根本不会发出(它不会使用已编译文件中的空间)。

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