交叉初始化全局(外部)变量



我在理解编译器/链接器在初始化具有跨文件作用域(extern)的变量时如何生成实际代码时遇到了问题。我的意思是,这些实例化的顺序是什么?这似乎是有问题的,当至少一个变量是使用一些其他…例如,如下所示:

main.cpp:

    #include <iostream>
    using namespace std;
    extern int varA;
    int varB=1;
    int main ()
     {
      cout << "varA = " << varA << endl;
      cout << "varB = " << varB << endl;
      system ("pause");
      return 0;
     }

variableA.cpp

extern int varB;
int varA=varB;

输出是:

varA = 1   --> as expected!!
varB = 1   --> as expected!!

现在,下面这个稍微复杂一点的代码给出了一个意想不到的结果:

classB.h file:

#ifndef H_classB
#define H_classB
class classB {
public: 
    classB();
    int varB;
};
#endif

classB.cpp file:

#include "classB.h"
classB myB;  // defined => cross-file scope by using extern in other files
classB::classB() {
    varB=1; // constructor initialized varB to 1
}

classA.h file:

#ifndef H_classA
#define H_classA
class classA {
public: 
    classA();
    int varA;
};
#endif

class .cpp file:

#include "classA.h"
#include "classB.h"
extern classB myB;
classA myA; // defined => cross-file scope by using extern in other files
classA::classA() {
    varA=myB.varB;  // constructor initialized varA to the value of the instance
                    // variable varB of the pre-instantiated object myB (defined 
                    //in classB.cpp). 
}

main.cpp:

#include <iostream>
using namespace std;
#include "classA.h"
#include "classB.h"
extern classA myA;
extern classB myB;
int main ()
{
  cout << "myA.varA = " << myA.varA << endl;
  cout << "myB.varB = " << myB.varB << endl;
  system ("pause");
  return 0;
}

在这个例子中,输出是:

myA.varA = 0   --> WHY??? shouldn't it be 1? 
myB.varB = 1   --> as expected!

这种行为背后的基本原理是什么?

这是实现定义的,建议尽可能避免。

最新更新