4

我有一个由 *.h 文件和 *.c 文件组成的软件模块。变量和函数声明位于 *.h 文件中,而函数定义位于 *.c 文件中。模块内的两个函数是辅助函数,不打算在模块外使用。

向模块用户明确这一意图的最佳方法是什么?

我尝试声明函数static,但在 *.h 文件中这样做会导致 GCC 编译器警告这些函数“声明为静态但从未定义”。即使 *.c 文件使用#include指令包含 *.h 文件,如何将 *.h 和 *.c 文件视为不同的翻译单元?

对于这个问题,是否有不涉及将要static在 *.c 文件中进行的函数声明及其定义的解决方案?虽然这个解决方案确实有效,但它打破了我认为将声明保存在头文件中并将定义保存在实现文件中的良好做法。

4

3 回答 3

8

*.h 和 *.c 文件如何被视为不同的翻译单元,即使 *.c 文件使用 #include 指令包含 *.h 文件?

标头通常也包含在其他源文件中。这就是警告的原因。

如果你编译包括头文件在内的其他文件,你确实有一个未定义的函数声明。

好的做法是在定义它们的源文件中声明静态函数,因为这是它们可见的唯一文件。

于 2013-01-04T01:22:12.190 回答
4

static声明不应出现在头文件中(除了inline那些,我现在将忽略它)。如果你想要一个只出现在模块内部的函数,根本不要把它放在.h文件中。该.h文件供外部使用。将静态函数放入.c文件中。请注意,如果需要,您仍然可以转发声明该函数。

于 2013-01-04T01:23:21.333 回答
1

在定义它们的源文件中声明静态函数(请同时提供原型),因为这是它们可见的唯一文件。

重复:函数声明为静态但从未定义

于 2016-12-09T22:25:49.060 回答