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)链接器搜索所有被告知要查找函数和其他符号的目标文件和库.
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关键字.函数默认具有外部链接,除非您将它们声明为静态.
使用函数原型是可以的,但很容易弄错.重新定义函数实现时,您将获得的链接器错误并不容易诊断.链接器不知道在哪里查找,为您提供一个包含函数定义的目标文件以保持其满意是您的工作.
| 归档时间: |
|
| 查看次数: |
54966 次 |
| 最近记录: |