在 libstdc++ 中,<iostream>
header定义了 的实例ios_base::Init
,其构造函数原子地增加一个计数器并在计数器为 0 时初始化 cin/cout/cerr。这保证了 cin/cout/cerr 总是#include <iostream>
在每个 TU 之后初始化。
我想实现一个具有与 相同行为的初始化程序ios_base::Init
,即我想保证我的一些全局对象在包含一些标头后立即初始化,然后再用于另一个全局变量的构造函数。但是,这需要使用原子操作。libstdc++ 使用 GCC 的扩展,这不是标准的:http ://gcc.gnu.org/viewcvs/trunk/libstdc%2B%2B-v3/src/c%2B%2B98/ios_init.cc?view=markup
根据How to use std::atomic Effective,std::atomic 是进行原子操作的唯一标准方法,所以我需要在所有 TU 的初始化程序之前构造一个全局原子变量。要初始化它,我需要另一个初始化器来初始化它,依此类推,遗憾的是,进行了一些无限递归。
所以我的问题是,最好的标准方法是什么?