为什么"extern int &c;"工作正常?

Why does "extern int &c;" working fine?

本文关键字:工作 extern int 为什么      更新时间:2023-10-16

在C++中,必须初始化引用变量。 int &a;//错误

static int &b; // Error

extern int &c; // No error

为什么编译器没有为说明符引用extern给出错误?

extern 关键字是编译器的指令,您现在正在声明一个符号,该符号将在链接期间填充,取自另一个对象文件。初始化预期在定义实际交易品种的地方发生。

如果您有 a.c 文件

int foo;
int &bar = foo;

和一个带有 b.c 文件的

extern int &bar;

当您将文件 b.c 编译为 b.o 时,编译器会将 bar 的符号留空。链接程序时,链接器需要在 a.o 中找到导出的符号bar,然后将 b.o 中的空白符号替换为 a.o 中的bar

如果链接器在链接对象文件中的任何位置找不到所需的符号 - 将发出链接器错误(不是编译器错误(。

为什么编译器没有给出错误以供extern参考?

因为extern int &c;不是一个定义,而只是一个宣言。它通知编译器c将在程序的其他位置定义。

"存储类说明符"上的 cppreference 页面解释了extern在此方案中的含义。

语言规范明确表示

8.3.2 参考资料
5 [...]引用的声明应包含初始值设定项 (8.6.3(,除非声明包含显式extern说明符 (7.1.1(、是类定义中的类成员 (9.2( 声明,或者是 参数或返回类型 (8.3.5(;参见 3.1.

这句话直接涵盖了您的情况。换言之,一般声明定义规则不排除引用。可以为在其他地方定义(和初始化(的引用创建非定义声明。

没有人禁止您将初始值设定项包含在具有显式 extern 关键字的引用声明中。但是,像往常一样,它会将非定义声明转换为定义