如您所知,在函数外部和不同编译单元中定义的变量的构造顺序是不固定的。有了这种理解,我设计了一些简单的代码,我认为这些代码在运行时会崩溃。然而,它只是没有。这是代码。
/* table.h */
#include <iostream>
using namespace std;
class table {
public:
int a;
int b;
table(table& t) {
a = t.a;
b = t.b;
}
void print(void) {
cout << a << endl;
cout << b << endl;
}
};
/* f1.cpp */
#include "./table.h"
extern table t2;
table t1 = t2;
/* f2.cpp */
#include "./table.h"
extern table t1;
table t2 = t1;
/* core.cpp */
#include "./table.h"
extern table t1;
extern table t2;
int main(void) {
t1.print();
t2.print();
return 0;
}
如您所见, t1 和 t2 相互引用。虽然我们不确定哪个会先分配,但很明显一个是访问另一个未分配的,这完全是一场灾难。这太奇怪了,它工作得很好。