初始化标准流对象
Initialize standard stream objects
在什么情况下以及为什么需要这样做:
class ios_base::Init {
static int init_cnt; // internal static counter (for exposition only)
public:
Init();
~Init();
}
从以下网站获取:cpluplus.com-ios_base::init
我读了描述并思考了一下,但这并没有多大帮助。。。
这是静态初始化顺序失败的解决方法。从本质上讲,如果你想使用静态初始化器中的全局流对象,你可以调用它来确保它们都是及时构建的。我熟悉的运行时已经正确地做到了这一点,但从技术上讲,这并不能保证。
(另请注意,从C++11开始,它是有保证的。)
需要它们来确保标准iostream对象,如std::cout
。基本上标准iostream对象保证由CCD_ 2的第一构造函数已经完成的时间。(init_cnt
成员是实现)此外,标准规定包括<iostream>
声明ios_base::Init
的静态实例(或表现得像这样),所以如果你写:
#include <iostream>
class X
{
public:
X() { std::cout << "something";
};
X anXwithStaticLifetime;
你保证std::cout
将在则运行CCD_ 7的构造函数。
当然,这只适用于一个翻译单元。如果您在标题中定义("X.hh"):
class X
{
public:
X();
};
然后在两个不同的翻译单元中:
#include "X.hh"
#include <iostream>
X::X()
{
std::cout << "something";
}
和:
#include "X.hh"
X anXwithStaticLifetime;
std::cout
很可能不会在执行构造函数时构造。通常的方式确保这是为了定义ios_base::Init
的本地实例在构造函数中:
X::X()
{
static ios_base::Init toEnsureInitialization;
std::cout << "something";
}
在实践中,大多数实现都使用额外的技巧降低风险。但据我所知,没有一个是100%,根据你的链接方式,你仍然会遇到问题。但是,如果你按照通常的方式做事,它们就不会发生。使用结果很多程序员没有意识到风险不要做必要的声明(而且它几乎总是有效的无论如何)。
相关文章:
- 使用带有C++对象和标准库容器的插件系统
- 没有取消引用/解包对象的标准方法?
- 标准::时间::d类型的挥发性对象
- 如何将来自 Boost.Python 的map_indexing_suite与自定义而不是标准对象一起使用?
- 无法重置 std::shared_ptr 标准::设置<>中的对象...为什么?
- C++标准:是否有结果对象?
- 在C++标准中记录对象的内存布局的哪个位置?
- 流对象来表示文件输入,然后是标准输入?
- 如何创建像标准库头一样的头,以便在不链接头中函数的所有对象文件的情况下编译程序?
- 列出 n 个对象的所有 k 排列的有效方法,同时满足特定标准
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- 哪个C 标准包括要添加到对象文件中的文件强制代码 /数据
- 提升::可选与标准::不可复制对象的可选
- 在标准布局对象中进行指针运算(例如,使用偏移量)时,我们是否需要使用 std::launder?
- 根据C++标准,int 变量是对象吗?
- 在C 中对二进制对象进行编码/解码的标准方法
- 从C 创建.NET标准对象
- 为非标准对象定义散列函数和相等函数
- 基对象和继承对象,用于将标准变量包装在C++中
- 如何在不注册对象的情况下访问标准项模型的数据?