如果我正在创建一个包含多个函数定义的头文件,为什么在同一个头文件中也包含函数声明是一种好习惯?当定义本身就足够时,包含声明似乎是多余的。
此外,我试图了解声明的用途。似乎如果该函数未在声明所在的同一文件中定义,则您不能单独在另一个文件中使用该声明并使用该函数。
是否有一个具体案例可以作为它如何使用的一个很好的例子?
如果我正在创建一个包含多个函数定义的头文件,为什么在同一个头文件中也包含函数声明是一种好习惯?当定义本身就足够时,包含声明似乎是多余的。
此外,我试图了解声明的用途。似乎如果该函数未在声明所在的同一文件中定义,则您不能单独在另一个文件中使用该声明并使用该函数。
是否有一个具体案例可以作为它如何使用的一个很好的例子?
将函数定义放入头文件通常是不好的,因为将文件包含在多个源中会导致多个定义。仅当函数声明为静态或内联,或者是模板的一部分时才可以。
如果在定义之前调用函数,则需要单独声明。否则你是对的,定义本身就足够了。
通常,您会将声明放在头文件中,将定义放在实现文件中。有几个原因:
1) 它提高了可读性,并为可能阅读您代码的任何其他人提供了一个“功能列表”。
2) 如果您碰巧生产了一个库,您可以简单地发布头文件和库的二进制文件,而无需发布您的完整源代码。
3)如果您需要制作依赖于平台的实现,您可以为相同的标头编译不同的实现。
清单可以继续,但它完成的基本原因是:其他人都希望它完成。
此规则有一些例外(内联、静态和模板)。在所有情况下,您都应该对头文件进行范围保护,以防止它们被多次引入。
如果我正在创建一个包含多个函数定义的头文件,
别那样做。
为什么在同一个标头中也包含函数声明是一种好习惯?
它不是。只需将声明放在标题中,并将定义放在相应的.cpp
文件中即可。
唯一的例外是,如果您要声明一个函数inline
(或者static
,如果您的编译器损坏,您可能需要使用模板函数),在这种情况下,您会将两者都放在头文件中。两者都有的原因是,当您引用稍后在同一文件中定义的函数时,您已经在顶部有声明,这样编译器就可以找到该函数。如果你不这样做,编译器就会窒息。
其他答案未提及的一个重要方面是编译速度:每次编译器看到函数定义时,它都必须为其生成代码,即使在给定的翻译单元中不需要该代码并且是多余的,因为编译器无法知道另一个编译单元实际上会提供编译后的功能。
大多数头文件被编译两到十次,将函数定义放入头文件中会减慢该函数的编译速度。
您可能不觉得这很重要,因为您的项目很小,但它对大型项目很重要,因为它会严重影响您的更改-编译-测试-周期。这是编译 C 程序比编译等效 C++ 程序耗时少的重要原因之一。
对于阅读头文件的人来说,他们可能会发现在一个地方查看所有声明更容易,而无需通读实现。
话虽如此,我不确定是否需要在同一个头文件和我见过的模板类(如 boost::scoped_ptr)中转发声明函数,人们不会费心转发声明函数