为什么需要在多个地方声明一个函数?
Why would you need to declare a function in multiple places?
我正在阅读 Bruce Eckel 的 Thinking in C++,第二版,第 82 页,其中写道,"You can declare a variable or a function in many different places, but there must be only one definition in C and C++ (this is sometimes called ODR: one-definition rule)."
什么情况可以从多次声明中获益?您是否需要这样做,还是只是为了使代码更具可读性?
谢谢。
"Declaring function in multiple places" 正是将带有函数声明的头文件包含到多个翻译单元中时所做的事情。这基本上是 C++(和 C)编程中必不可少的日常实践。
无论您是否为此目的使用头文件,都必须先声明函数,然后再在使用它的每个翻译单元中首次使用它。由于 C++ 程序通常包含多个翻译单元,因此您别无选择,只能在多个地方声明相同的函数。
您还可以在相同的 翻译单元中多次声明相同的独立(非成员)函数。这样做没有错误。但大多数时候这确实是多余的。
调用函数时必须在每个源文件中声明一个函数。或者在每个调用 function/method 中,如果您不喜欢为整个文件声明它。
这就是我们在每个源文件中放置 #include <iostream>
之类内容的原因。
你一直这样做,可能 noticing/thinking 没有。
无论何时包含头文件,通常都会包含在其他地方定义的内容的声明。
以不同的方式思考它:编译器需要以某种方式知道您要使用的所有内容,编译器从每个翻译单元的空白内存开始。声明告诉编译器某些函数从外部(签名)看起来像什么,或者某些类型(在内存中)有多大。没有这个,当处理在其他地方声明的东西时,它不知道如何调用函数或需要多少内存allocate/copy。
通常,您希望在一个文件中只有一个地方声明它(例如在 .h
文件中。)这可能会通过 #include
变成多个地方,即为什么它可以在多个地方定义。
但是,在某些(罕见的)情况下,您可能想要声明一个函数两次。例如,有时在调试时我可能只是插入:
void someFunction(int foobar);
在我正在调试的函数上面,然后调用someFunction
(即使在不同的文件中,只要不是static
。)这不一定是很好的做法,但也许我 还 不想添加 .h 文件并在我的 Makefile/CMakeLists/etc 中设置它。然而,例如因为它会强制重新编译更多的东西。
有一些相关的场景,但我想强调的是,这被认为是不好的做法。你不会这样犯的;这可能只是一个快速破解。
我正在阅读 Bruce Eckel 的 Thinking in C++,第二版,第 82 页,其中写道,"You can declare a variable or a function in many different places, but there must be only one definition in C and C++ (this is sometimes called ODR: one-definition rule)."
什么情况可以从多次声明中获益?您是否需要这样做,还是只是为了使代码更具可读性?
谢谢。
"Declaring function in multiple places" 正是将带有函数声明的头文件包含到多个翻译单元中时所做的事情。这基本上是 C++(和 C)编程中必不可少的日常实践。
无论您是否为此目的使用头文件,都必须先声明函数,然后再在使用它的每个翻译单元中首次使用它。由于 C++ 程序通常包含多个翻译单元,因此您别无选择,只能在多个地方声明相同的函数。
您还可以在相同的 翻译单元中多次声明相同的独立(非成员)函数。这样做没有错误。但大多数时候这确实是多余的。
调用函数时必须在每个源文件中声明一个函数。或者在每个调用 function/method 中,如果您不喜欢为整个文件声明它。
这就是我们在每个源文件中放置 #include <iostream>
之类内容的原因。
你一直这样做,可能 noticing/thinking 没有。
无论何时包含头文件,通常都会包含在其他地方定义的内容的声明。
以不同的方式思考它:编译器需要以某种方式知道您要使用的所有内容,编译器从每个翻译单元的空白内存开始。声明告诉编译器某些函数从外部(签名)看起来像什么,或者某些类型(在内存中)有多大。没有这个,当处理在其他地方声明的东西时,它不知道如何调用函数或需要多少内存allocate/copy。
通常,您希望在一个文件中只有一个地方声明它(例如在 .h
文件中。)这可能会通过 #include
变成多个地方,即为什么它可以在多个地方定义。
但是,在某些(罕见的)情况下,您可能想要声明一个函数两次。例如,有时在调试时我可能只是插入:
void someFunction(int foobar);
在我正在调试的函数上面,然后调用someFunction
(即使在不同的文件中,只要不是static
。)这不一定是很好的做法,但也许我 还 不想添加 .h 文件并在我的 Makefile/CMakeLists/etc 中设置它。然而,例如因为它会强制重新编译更多的东西。
有一些相关的场景,但我想强调的是,这被认为是不好的做法。你不会这样犯的;这可能只是一个快速破解。