C++ C++;取决于链接顺序的全局对象定义
给定main.cpp:C++ C++;取决于链接顺序的全局对象定义,c++,linker,global-variables,C++,Linker,Global Variables,给定main.cpp: #include "A.h" A a; int main() { } A.h: A.cpp: #include <iostream> #include "A.h" A::A() { std::cout << "A ctor\n"; } 为什么不同? 如果我将a的定义从全局名称空间移动到main的范围内,它会按照我的预期打印出a ctor > g++ --version g++ (Ubuntu 7.5.0-3ubuntu1~18.
#include "A.h"
A a;
int main() {
}
A.h:
A.cpp:
#include <iostream>
#include "A.h"
A::A() {
std::cout << "A ctor\n";
}
为什么不同?
如果我将a
的定义从全局名称空间移动到main
的范围内,它会按照我的预期打印出a ctor
> g++ --version
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
由于C++中的全局对象以未定义的顺序创建
在第一种情况下:对象“a”(在全局空间中)在std::cout之前创建,我们在“a::a()”访问std::cout时失败。这似乎在非局部变量的动态初始化部分下进行了描述。cout在一个翻译单元A.cpp中初始化,而A在另一个翻译单元main.cpp中初始化。单个翻译单元内的顺序与定义出现的顺序相同,但翻译单元之间的顺序是不确定的,如第3节所述,有序动态初始化。这是否回答了您的问题?是的,将#include放在公共hdr文件中修复了这个问题,就像在那里一样。因此,通过列出包含std的可重定位对象文件:;cout definition(A.o)首先,还修复了问题..是的。通过将A.o(其中包括定义std::cout的so)放在cmd行的第一位,或者也包括在main.cpp中(比如通过A.h),在对象“A”创建之前创建std::cout。
> g++ main.o A.o
> ./a.out
Segmentation fault (core dumped)
> g++ A.o main.o
>./a.out
A ctor
> g++ --version
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0