C 什么是静态的?

C 什么是静态的?,c,gcc,gnu,libuv,C,Gcc,Gnu,Libuv,在libuv文件中,我看到以下宏 #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\u init 根据我的解释 heap inl.h代表堆“inline”

libuv
文件中,我看到以下宏

#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\u init

根据我的解释

  • heap inl.h
    代表堆“inline”
  • HEAP\u EXPORT
    正在导出一个函数以供其他源文件使用

我不明白的是,为什么导出的函数被标记为
\u属性((未使用))\u
。另外,为什么它也是一个
静态
声明?我认为
静态
函数只能在定义它的文件中使用。另外,in-lining与这些有什么关系?

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

因此,
HEAP\u EXPORT
并不是真的导出任何东西,只是让函数可用(如果正文也在标题中,如果文件名为-inl,则为-inl,这确实表明内容将内联到编译文件中)。

如前所述:

未使用的

此属性附加到函数,表示该函数可能未使用。GCC不会为此函数生成警告

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

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