c++ - std::cout 在哪里定义?

标签 c++ std

我想知道它是如何工作的...

<iostream>标题,有 namespace std :

#include <ios>
#include <streambuf>
#include <istream>
#include <ostream>

namespace std {
  extern istream cin;
  extern ostream cout;
  extern ostream cerr;
  extern ostream clog;
  extern wistream wcin;
  extern wostream wcout;
  extern wostream wcerr;
  extern wostream wclog;
}

所以,coutostream 类型对象的名称,并且在另一个文件中定义(由于 extern )。好的。

当我尝试在我的简单程序中创建一个 ostream对象,我不能,因为 ostream 的构造函数类是 protected .好的。

那么,我如何在外部文件中创建(定义)一个对象,它有一个 protected构造函数,看起来像一个全局变量?

最佳答案

gcc 使用的 libstdc++ 是如何做到的:

cout 的存储被定义为类型为fake_ostream 的全局变量,它可以毫无问题地构造。 https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/src/c%2B%2B98/globals_io.cc

然后在库初始化期间使用显式构造函数重写一个新的放置。 https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/src/c%2B%2B98/ios_init.cc

其他编译器有自己的库,可能会使用不同的技巧。检查 clang 使用的 libc++ 源代码留给读者作为练习。

关于c++ - std::cout 在哪里定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67365282/

相关文章:

c++ - 将静态变量对象初始化为相同的值

c++ - 在qt中单击按钮重写文件内容

c++ - 使用宏替换具有细微差异的重复代码块

c++ - 如何在不包含 "using namespace std"的情况下在代码中使用 std?

c++ - 在 SHA256 哈希函数中使用的 Setw 和 setfill

c++ - 清除标准容器而不是构造和破坏它是否有意义?

c++ - 条件运算符问题

c++ - 为什么在构造 std::thread 时参数 move 了两次

c++ - 为什么VC++编译器使用boost\range\iterator.hpp

c++ - 如何编写标准的 C++ 迭代器?