为什么"extern int &c;"工作正常?
Why does "extern int &c;" working fine?
在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
关键字的引用声明中。但是,像往常一样,它会将非定义声明转换为定义。
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 为什么在全局范围内使用"extern int a"似乎不行?
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 如何使用extern类
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- C++ extern const char* 未按预期工作
- 为什么"extern int &c;"工作正常?
- 为什么这个 extern "C" 函数不能使用 python ctypes 工作?
- C++:我无法理解"extern"关键字在我的程序中是如何工作的
- 为什么"extern const int n;"不能按预期工作?
- extern如何在名称空间中工作