关于函数的C++ extern关键字.为什么不包含头文件?

use*_*421 45 c++ linker extern

如果我理解正确,这意味着

extern void foo();
Run Code Online (Sandbox Code Playgroud)

函数foo在另一个翻译单元中声明.

1)为什么不#include声明此函数的头?

2)链接器如何知道在链接时寻找函数的位置?

编辑:也许我应该澄清上面的声明然后使用该函数

foo();
Run Code Online (Sandbox Code Playgroud)

它从未在此翻译单元中定义.

Bri*_*eal 28

1)它可能没有头文件.但是,是的,一般来说,对于大型项目,如果多个翻译单元将使用该功能,您应该有一个头文件(不要重复自己).

2)链接器搜索所有被告知要查找函数和其他符号的目标文件和库.

  • 如果函数有外部链接,那么是.但是,您将无法调用在未命名的命名空间中声明的函数或声明为static(除非您知道编译器/链接器如何破坏名称). (3认同)

AnT*_*AnT 16

不,这意味着函数foo是通过外部链接声明的.外部链接意味着名称foo是指整个程序中的相同功能.定义函数无关紧要.它可以在此翻译单元中定义.它可以在其他翻译单元中定义.

使用extern示例中显示的关键字是多余的.函数默认情况下始终具有外部链接.以上是100%相当于

void foo();
Run Code Online (Sandbox Code Playgroud)

对于链接器,当链接器将程序链接在一起时,它只是在任何地方查找.它查找所有定义,直到找到其定义foo.


goe*_*son 16

正如其他人已经说过的那样,extern关键字用于表示名称(变量或函数)具有外部链接,这意味着名称指的是整个程序中的同一个对象.此外,这是在文件范围定义的变量和函数的默认值,因此这种用法是多余的.

extern关键字的另一个用法是这样的:

extern "C" void foo();
Run Code Online (Sandbox Code Playgroud)

这意味着函数foo将使用C约定进行链接链接(可能因为这是在C库中定义的函数,或者是一个旨在由C程序调用的函数).

  • “对于在文件范围内定义的变量和函数,因此这种用法是多余的”该声明不准确。对于非常量全局变量,“extern”关键字会告诉编译器当前行不是定义(如果省略显式定义) (2认同)

Han*_*ant 8

它已经意味着没有extern关键字.函数默认具有外部链接,除非您将它们声明为静态.

使用函数原型是可以的,但很容易弄错.重新定义函数实现时,您将获得的链接器错误并不容易诊断.链接器不知道在哪里查找,为您提供一个包含函数定义的目标文件以保持其满意是您的工作.