标头中的函数声明

时间:2013-08-27 20:50:45

标签: c++

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

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

是否有一个特定案例可以作为其使用方式的一个很好的例子?

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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

2)如果您碰巧为库提供产品,您只需发送头文件和库的二进制文件,而无需发布完整的源代码。

3)如果您需要进行与平台相关的实现,您可以使用针对相同标头编译的不同实现。

列表可以继续,但基本原因是:其他人都希望它能够完成。

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

答案 2 :(得分:1)

  

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

停止这样做。

  

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

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

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

说这个,我不确定是否需要在我看到的同一个头文件和模板类中转发声明函数(比如boost :: scoped_ptr)人们不打算转发声明函数