C ++中未初始化的引用(使用extern声明)

时间:2017-08-02 23:05:18

标签: c++ reference extern

我无法解释为什么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 ++中的引用总是需要在声明它们时进行初始化。 有人可以帮助解释为什么上面的代码编译器?

1 个答案:

答案 0 :(得分:0)

这是未定义的行为。不同的编译器将有不同的处理方式。例如,当我尝试执行您所做的操作时,Visual Studio确实引发了错误。