交叉初始化全局(外部)变量
cross-initialization of global (extern) variables
我在理解编译器/链接器在初始化具有跨文件作用域(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!
这种行为背后的基本原理是什么?
这是实现定义的,建议尽可能避免。
相关文章:
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 堆栈/帧指针作为外部变量
- const_cast const 方法中的"this"将"this"分配给外部变量?
- 外部变量的初始化
- 如何在命名空间中初始化外部变量
- 将全局外部变量的私有版本与 OpenMP 结合使用
- 使用外部变量会导致"unsigned char"错误LNK2001
- 为什么通过复制捕获 lambda 具有与外部变量相同的地址
- 我们是否应该在项目中包含的所有文件中声明外部变量
- 如何将 Wifi.localIP() 转换为字符串并将其存储到外部变量
- 具有仅在某些情况下引用外部变量的属性的类
- C 中的外部变量
- Xcode C++外部变量链接器错误
- 使用外部变量时的多重定义错误
- C 和 C++ 中的外部变量有什么区别
- 默认情况下,非常量变量不被视为外部变量吗?
- 当外部变量在其他文件中声明不同时,如何使G 产生警告
- 是初始化为其默认值的外部变量
- 将外部变量传递给类 c++
- C++中有更多的类和外部变量