C++ 在运行时,std库何时完全初始化,以便在不破坏代码的情况下使用?

C++ 在运行时,std库何时完全初始化,以便在不破坏代码的情况下使用?,c++,gcc,std,libc,static-initialization,C++,Gcc,Std,Libc,Static Initialization,我正在从事一个项目,该项目在调用main之前包含启动代码。但是,我不知道std库的初始化 我知道下面的代码将抛出分段错误 #include <iostream> void foo(void) __attribute__((constructor)); void foo() { std::cout << "foo" << std::endl; } int main() { std::cout << "Simple program to t

我正在从事一个项目,该项目在调用
main
之前包含启动代码。但是,我不知道std库的初始化

我知道下面的代码将抛出分段错误

#include <iostream>

void foo(void) __attribute__((constructor));
void foo() {
  std::cout << "foo" << std::endl;
}

int main() {
  std::cout << "Simple program to throw a segmentation fault" << std::endl;
}
#包括
void foo(void)_属性__((构造函数));
void foo(){
std::cout

但是,当前调用具有静态存储持续时间和函数(属性<代码>构造函数< /代码> >的函数的C++对象的构造函数的顺序是未指定的。< /P> 这意味着ELF构造函数和静态对象(用于初始化

std::cout
)不能很好地混合

<>代码>代码> STD::CUT是一个历史性的例外,因为它不依赖于C++标准库中的构造函数。在ELF系统上,ELF构造函数以拓扑顺序运行。这意味着动态链接器查看库依赖关系(<代码> DTTY需要条目)。并在库的依赖项初始化之前延迟库的初始化


<> P> C++代码可以假设当运行ELF构造函数和由应用程序定义的全局对象时,C++运行库完全被初始化。唯一的例外是C++库,它优先使用标准C++标准库本身所使用的例程(通过ELF符号插入)。,如果库之间存在循环依赖关系,因此没有正确的初始化顺序。这两种情况都不常见,除非您编写自定义的
malloc
或类似的东西,否则可以通过正确的应用程序设计来避免。

根据经验,只要
main()
在调用堆栈上。如果您想便于移植,则不能。之间的初始化顺序未定义。要知道标准库中的所有内容都正常工作,唯一可靠的方法是使用
main
函数。@EJP:我想这是较早的。静态初始化代码可以调用标准库代码IIANM,特别是它可以
STD::你有一个很有价值的属性,很明显,它和初始化顺序混淆。你需要阅读编译器的文档来知道这个东西是怎么做的。这不是标准C++。在标准C++中,运行库在代码得到控制之前就已经初始化了。@ Rohit:再次,在标准C++中,运行库已经被使用过。在你的代码得到控制之前初始化。这不是你必须担心的事情,除非你正在做一些与编译器相关的事情,你应该在使用之前阅读和理解。我以
std::cout
为例。我想知道更多关于std初始化的信息,以及它实际初始化的确切时间?O凯,我添加了一些关于精灵的信息。我希望这就是你想要的。