gpt4 book ai didi

c++ - 全局(外部)变量的交叉初始化

转载 作者:行者123 更新时间:2023-11-30 04:20:06 25 4
gpt4 key购买 nike

我无法理解编译器/链接器在初始化具有跨文件作用域(外部)的变量时如何生成实际代码。我的意思是,这些实例化的顺序是什么?当至少一个变量是使用其他变量定义时,这似乎有问题......例如,这按预期工作:

主要.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;
}

变量A.cpp

extern int varB;
int varA=varB;

输出是:

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

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

classB.h 文件:

#ifndef H_classB
#define H_classB

class classB {
public:
classB();
int varB;
};

#endif

classB.cpp 文件:

#include "classB.h"

classB myB; // defined => cross-file scope by using extern in other files

classB::classB() {
varB=1; // constructor initialized varB to 1
}

A类.h文件:

#ifndef H_classA
#define H_classA

class classA {
public:
classA();
int varA;
};

#endif

classA.cpp 文件:

#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).
}

主要.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!

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

最佳答案

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

关于c++ - 全局(外部)变量的交叉初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15406066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com