【发布时间】:2012-04-23 03:21:40
【问题描述】:
我反复阅读,头文件应包含其他文件使用源代码所需的所有声明。然后假设您有一个不被其他源文件直接使用的函数(换句话说,一个非接口函数)。它的原型是否应该放在 .c 文件的顶部,因为它不会被其他文件使用?还是应该将它与所有其他函数一起放在头文件中,以便将 .c 文件中存在的函数完全汇总到一个地方?
【问题讨论】:
标签: c header-files function-prototypes
我反复阅读,头文件应包含其他文件使用源代码所需的所有声明。然后假设您有一个不被其他源文件直接使用的函数(换句话说,一个非接口函数)。它的原型是否应该放在 .c 文件的顶部,因为它不会被其他文件使用?还是应该将它与所有其他函数一起放在头文件中,以便将 .c 文件中存在的函数完全汇总到一个地方?
【问题讨论】:
标签: c header-files function-prototypes
如果该函数未被其他 .c 文件使用,则它不应在头文件中有原型。你应该给它static 修改器,然后放置 使用它的(唯一的).c 文件顶部的原型。
如果合理可行,你可以在所有函数之前定义函数 调用它的函数,因此您甚至不需要原型。
【讨论】:
在我看来,将原型语法中的所有函数声明放在.c 源文件的顶部是一种很好的风格。它还可以为读者记录您的源代码。
您不希望将声明放在 .h 头文件中,因为您会不必要地暴露程序的内部结构。
哦,别忘了在函数声明中添加static 说明符。
【讨论】:
是的,私有函数的原型应该和函数放在同一个.c 文件中。标头定义了外部接口。
比起前向声明,一些程序员更喜欢按照函数的使用顺序来定义函数,这样就不需要原型了。当然,如果两个或多个函数相互调用,则不能这样做。
我个人的偏好是先声明所有函数,这样您就可以对文件有一个概览。
如果您有在单个模块中使用的函数(一小组文件共同实现一个功能单元),那么创建一个 second 模块特定的头文件是完全合理的。模块中的所有文件——但没有外部源文件——将#include它。
【讨论】:
鉴于头文件本质上是在 C 中声明外部接口的唯一方法,因此不属于该接口的内容不应出现在头文件中。
C 就是这样,有时这并不实际,因为外部可见定义的内部视图需要引用它;在这种情况下,您可以将它放在标题中,但受#define 保护,该#define 清楚地表明其内部出处,同样使用#ifdef 来选择需要它的定义的内部版本和外部版本。 (您会经常在系统头文件中看到这种情况。)不过最好尽量避免这种情况。
【讨论】:
标头包含接口信息(外部世界使用“模块”中的功能所需的任何信息——例如 .c 文件)。所以内部函数(不从外部使用),不要进入标题
在 .c 文件中,它取决于组织
【讨论】: