在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
函数只能在其定义的文件中使用。此外,内联函数与其中的任何内容有什么关系?
答案 0 :(得分:4)
static
关键字表示该函数在已编译文件本地。当它在标题中时,表示它已包含在所有编译文件中。
然后的问题是,如果不使用此功能,某些编译器(带有适当文件的clang,gcc,VS)将生成警告。将功能标记为未使用将删除此警告(如果警告被视为错误,则可能会导致错误)。
因此HEAP_EXPORT
并没有真正导出任何内容,只是使函数可用(如果主体也位于标头中,如果文件名为-inl就是这种情况,这实际上是表明内容将内联到已编译的文件中。
答案 1 :(得分:1)
如here所述:
unused
此属性,附加到函数上,意味着该函数可能未被使用。 GCC不会对此功能发出警告。 GNU C ++当前不支持该属性,因为没有参数的定义在C ++中有效。
此属性还具有附加的优点,根据情况,如果从不调用该函数,则该函数可能根本不会发出(它不会使用已编译文件中的空间)。
这通常与标头库中的static
函数一起使用,因此仅将实际使用的函数作为机器代码发出,并避免警告。