我有一个由* .h文件和* .c文件组成的软件模块。变量和函数声明位于* .h文件中,而函数定义位于* .c文件中。模块中的两个函数是辅助函数,不能在模块外部使用。
向模块用户明确表达此意图的最佳方法是什么?
我尝试声明函数static
,但是在* .h文件中这样做会导致GCC编译器警告函数是“声明为静态但从未定义”。即使* .c文件使用#include
指令包含* .h文件,* .h和* .c文件如何被视为不同的翻译单元?
是否有解决此问题的方法,不涉及在* .c文件中放置要生成的函数static
的声明及其定义?虽然这个解决方案确实有效,但它打破了我认为在头文件中保存声明和实现文件中的定义的良好做法。
答案 0 :(得分:8)
即使* .c文件使用#include指令包含* .h文件,* .h和* .c文件如何被视为不同的翻译单元?
标头通常也包含在其他源文件中。这就是警告的原因。
如果编译包括标题在内的其他文件,则确实声明了一个未定义的函数。
好的做法是在定义的源文件中声明静态函数,因为这是它们可见的唯一文件。
答案 1 :(得分:4)
static
声明不应出现在头文件中(inline
除外),我现在将忽略它。如果您想要一个仅出现在模块内部的功能,请不要将其放在.h
文件中。 .h
文件用于外部消费。将静态函数放在.c
文件中。请注意,如果需要,您仍然可以转发声明函数。
答案 2 :(得分:0)
在他们定义的源文件中声明静态函数(请同时提供原型),因为这是他们可见的唯一文件。