我在头文件中添加了static
关键字的方法。 e.g。
static int32_t Tlvlist_AddRawt(Tlvlist *a, uint8_t type, uint16_t size, const void *bytes);
该方法在.c文件中实现静态 函数名称中不存在关键字。
从同一.c文件的另一个函数调用此方法。 后一个函数(使用此静态函数)也从main调用。
但我收到警告:"未使用的功能' Tlvlist_AddRawt'"在头文件中。 为什么会这样?
PS。我使用Xcode。
答案 0 :(得分:7)
将函数声明标记为静态时,它在出现的转换单元外部不可见。而且,它在每个出现的翻译单元中代表不同的功能。因此,在头文件中使用static
几乎不是一个好主意,因为这样你就会在包含头文件的每个C源中声明一个单独的函数。
编译器诊断告诉您至少有一个C文件包含您的标头但未提供Tlvlist_AddRawt()
的定义以与标头中的声明一起使用。
如果要将静态函数与其定义分开声明 - 例如将其原型化为源文件中较早出现的其他函数 - 则将声明放在C源文件的顶部。正文出现而不是在标题中。将它放在标题中会适得其反。
答案 1 :(得分:4)
您永远不会在用于其他模块的头文件中声明static
函数,因为创建函数static
背后的目的是将其“隐藏”到模块外部的用户。静态C函数仅在定义它们的转换单元 * 内可见。当函数声明为static时,但同一翻译单元中没有其他函数使用它时,您会收到“未使用的静态”警告。
如果您想在一个文件中定义一个函数,并在另一个文件中使用它,您需要将其前向声明放在标题中,包括来自两个翻译单元的标题,并将翻译结果链接在一起。从标头中删除static
关键字可以解决此问题。
* 翻译单元是.c文件的奇特名称。