Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;取决于链接顺序的全局对象定义_C++_Linker_Global Variables - Fatal编程技术网

C++ C++;取决于链接顺序的全局对象定义

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.

给定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.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