为什么需要在多个地方声明一个函数?

时间:2016-04-19 05:01:38

标签: c++ declaration

我正在阅读C ++中的思考,Bruce Eckel撰写的第二版,第82页,其中包含,"您可以在许多不同的地方声明变量或函数,但必须只有一个定义C和C ++(有时称为ODR:单定义规则)。"

什么样的情况可以从多次声明中受益?您是否需要这样做或者仅仅是为了使代码更具可读性?

谢谢。

4 个答案:

答案 0 :(得分:3)

“在多个位置声明函数”正是您将包含函数声明的头文件包含到多个转换单元中时所执行的操作。这基本上是C ++(和C)编程中必不可少的日常实践。

无论您是否为此目的使用头文件,都必须在使用它的每个翻译单元中首次使用之前声明该函数。由于C ++程序通常包含多个翻译单元,因此您别无选择,只能在多个位置声明相同的功能。

您还可以在相同的翻译单元中多次声明相同的独立(非成员)功能。这样做没有错误。但大部分时间这确实是多余的。

答案 1 :(得分:1)

调用函数时,必须在每个源文件中声明一个函数。或者在每个调用函数/方法中,如果你不想为整个文件声明它。

这就是我们在每个源文件中添加#include <iostream>之类的原因。

答案 2 :(得分:1)

你一直这样做,可能没有注意到它的想法。

每当您包含头文件时,通常都会包含在其他地方定义的内容的声明。

以不同的方式思考:编辑器需要知道您想要使用的所有内容,编译器以每个翻译单元的空白内存开头。声明告诉编译器某些函数从外部(签名)看起来是什么样的,或者某些类型是多大(在内存中)。如果没有这个,它就不知道在处理其他地方声明的东西时如何调用函数或分配/复制多少内存。

答案 3 :(得分:1)

通常,您只希望在声明文件的地方只有一个地方(例如在.h文件中。)这可能会通过#include变成多个地方,这就是为什么它可以在多个地方定义。

但是,有些(罕见)场景可能需要两次声明一个函数。例如,有时在调试时我可能只是插入:

void someFunction(int foobar);

在我正在调试的函数之上,然后调用someFunction(即使它在不同的文件中,只要它不是static。)这不一定是一个好习惯,但也许我想要添加.h文件并在我的Makefile / CMakeLists /等中设置它。但是,例如因为它会迫使更多东西重新编译。

有一些相关的场景,但我想强调这被认为是不好的做法。你不会这样做的;它可能只是一个快速的黑客。