我无法解释为什么C ++中的以下代码构造即使使用-Wall选项也不会给出任何编译错误或警告。
假设有一个头文件referencesTest.hpp,其中使用extern声明对int的引用,如下所示:
<ion-fab top right edge>
<div *ngIf="sessionAgent">
<button color="default" ion-fab>{{sessionAgent.status.value}}</button>
<ion-fab-list>
<button color="secondary" *ngIf="sessionAgent.status.value == 'Offline'" (click)="doOnline()" ion-fab>On</button>
<button color="danger" *ngIf="sessionAgent.status.value == 'Online'" (click)="doOffline()" ion-fab>Off</button>
</ion-fab-list>
</div>
</ion-fab>
在相应的源文件referencesTest.cpp中,我们定义了引用,但未初始化,我们尝试在运行时为它分配一个值,如下所示:
#ifndef REFERENCES_TEST_HPP
#define REFERENCES_TEST_HPP
extern int &refToInt;
#endif /* REFERENCES_TEST_HPP */
使用GCC版本5.4.0编译时
#include "referencesTest.hpp"
//Why no error/warning is raised here ?
int &refToInt;
int main()
{
int testVariable = 8;
//This crashes on run time with Seg fault but no compilation error/warnings.
refToInt = testVariable;
return 0;
}
它在运行时崩溃与分段错误,但为什么编译器不会在此处引发任何错误/警告? 我的理解是,C ++中的引用总是需要在声明它们时进行初始化。 有人可以帮助解释为什么上面的代码编译器?
答案 0 :(得分:0)
这是未定义的行为。不同的编译器将有不同的处理方式。例如,当我尝试执行您所做的操作时,Visual Studio确实引发了错误。