msc*_*msc 6 c++ variables reference extern
在C++中,必须初始化引用变量.int&a; //错误
static int &b; // Error
Run Code Online (Sandbox Code Playgroud)
但
extern int &c; // No error
Run Code Online (Sandbox Code Playgroud)
为什么编译器没有给出extern说明符引用的错误?
imm*_*tal 12
该extern关键字是你现在宣布,将在连接时填写的象征,从另一个对象文件所采取的编译器指令.初始化是在实际符号定义的地方发生的.
如果你有一个ac文件
int foo;
int &bar = foo;
Run Code Online (Sandbox Code Playgroud)
和一个bc文件
extern int &bar;
Run Code Online (Sandbox Code Playgroud)
当你将文件bc编译成bo时,编译器会将符号bar留空.链接程序时,链接器需要bar在ao中找到导出的符号,然后用barfrom ao 替换bo中的空白符号
如果链接器无法在链接的目标文件中的任何位置找到所需的符号,则将发出链接器错误(不是编译器错误).
为什么编译器不提供错误以供
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关键字的引用声明中.但是,像往常一样,它会将非定义声明转换为定义.