1

如果我正在创建一个包含多个函数定义的头文件,为什么在同一个头文件中也包含函数声明是一种好习惯?当定义本身就足够时,包含声明似乎是多余的。

此外,我试图了解声明的用途。似乎如果该函数未在声明所在的同一文件中定义,则您不能单独在另一个文件中使用该声明并使用该函数。

是否有一个具体案例可以作为它如何使用的一个很好的例子?

4

5 回答 5

5

将函数定义放入头文件通常是不好的,因为将文件包含在多个源中会导致多个定义。仅当函数声明为静态或内联,或者是模板的一部分时才可以。

如果在定义之前调用函数,则需要单独声明。否则你是对的,定义本身就足够了。

于 2013-08-27T20:55:30.880 回答
2

通常,您会将声明放在头文件中,将定义放在实现文件中。有几个原因:

1) 它提高了可读性,并为可能阅读您代码的任何其他人提供了一个“功能列表”。

2) 如果您碰巧生产了一个库,您可以简单地发布头文件和库的二进制文件,而无需发布您的完整源代码。

3)如果您需要制作依赖于平台的实现,您可以为相同的标头编译不同的实现。

清单可以继续,但它完成的基本原因是:其他人都希望它完成。

此规则有一些例外(内联、静态和模板)。在所有情况下,您都应该对头文件进行范围保护,以防止它们被多次引入。

于 2013-08-27T21:08:57.197 回答
1

如果我正在创建一个包含多个函数定义的头文件,

别那样做。

为什么在同一个标​​头中也包含函数声明是一种好习惯?

它不是。只需将声明放在标题中,并将定义放在相应的.cpp文件中即可。

唯一的例外是,如果您要声明一个函数inline(或者static,如果您的编译器损坏,您可能需要使用模板函数),在这种情况下,您会将两者都放在头文件中。两者都有的原因是,当您引用稍后在同一文件中定义的函数时,您已经在顶部有声明,这样编译器就可以找到该函数。如果你不这样做,编译器就会窒息。

于 2013-08-27T20:55:18.627 回答
1

其他答案未提及的一个重要方面是编译速度:每次编译器看到函数定义时,它都必须为其生成代码,即使在给定的翻译单元中不需要该代码并且是多余的,因为编译器无法知道另一个编译单元实际上会提供编译后的功能。

大多数头文件被编译两到十次,将函数定义放入头文件中会减慢该函数的编译速度。

您可能不觉得这很重要,因为您的项目很小,但它对大型项目很重要,因为它会严重影响您的更改-编译-测试-周期。这是编译 C 程序比编译等效 C++ 程序耗时少的重要原因之一。

于 2013-08-27T21:30:19.220 回答
0

对于阅读头文件的人来说,他们可能会发现在一个地方查看所有声明更容易,而无需通读实现。

话虽如此,我不确定是否需要在同一个头文件和我见过的模板类(如 boost::scoped_ptr)中转发声明函数,人们不会费心转发声明函数

于 2013-08-27T20:57:25.880 回答