【问题标题】:Where is cout declared?cout 在哪里声明?
【发布时间】:2023-10-13 16:14:02
【问题描述】:

我的计算机科学教授希望我们找到cout 的声明。我使用 g++ 和 -E 参数编译了一个简单的 Hello world 程序。这是我的 hello.cpp 的样子:

#include <iostream>

using namespace std;

int main(){

  string name="";

  cout << "Good morning! What's your name?";

  cin >> name;

  cout << "Hello " << name << ".\n";

  return 0; 

}

我的编译命令:

g++ -E hello.cpp > hello.p

在 hello.p 中,我在 VIM 中进行了搜索,如下所示:

:/cout

我看到以下行:

extern ostream cout;

这是cout 的声明,coutostream 类的实例吗?

编辑:

wcout 声明有什么用?如果我没记错的话,字母“w”代表“宽”,但我不知道它有什么含义。 wcoutwostream 是什么?

【问题讨论】:

  • 我愿意猜测当您链接到 IOStream 时附加到可执行文件的代码中的某个位置。
  • @Aslai - 我已经从该代码中提取了一行。我想知道是不是这样。
  • 试试这个:cplusplus.com - 在搜索框中输入cout
  • 是的,cout 是 ostream 类的一个实例。

标签: c++ terminology cout ostream


【解决方案1】:

是的,这确实是 std::cout 的声明,在 &lt;iostream&gt; 标头中找到。

相关标准部分可见§27.4.1 [iostream.objects.overview]

标题&lt;iostream&gt;概要

#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;
}

p1 标头&lt;iostream&gt; 声明了将对象与&lt;cstdio&gt; (27.9.2) 中声明的函数提供的标准C 流相关联的对象,并包含使用这些对象所需的所有标头。

【讨论】:

  • @Moshe: wcout 只是一个专门针对wchar_tbasic_ostream,这意味着Windows 上的UTF-16 和Linux IIRC 上的UTF-8。
【解决方案2】:

这是cout的声明吗,cout是ostream类的实例吗?

是的,这是std::cout 的声明,是的,它是std::ostream 的一个实例。它被声明为extern,因此即使标头包含在多个翻译单元中,该对象也只会创建一次。

【讨论】:

  • 不要忘记namespace std { ... } 部分。这是std::ostream std::cout,而不是::ostream ::cout