【发布时间】:2013-09-13 17:55:24
【问题描述】:
在 C++ 中,istream 对象 std::cin 在标头 <iostream> 中声明,但它在哪里定义?
【问题讨论】:
在 C++ 中,istream 对象 std::cin 在标头 <iostream> 中声明,但它在哪里定义?
【问题讨论】:
标准没有强制规定的地方,完全取决于实施。
这是我的位置:
$ nm -C /usr/local/lib64/libstdc++.so.6 | grep -w cin
0000000000305900 B std::cin
【讨论】:
您正在使用的实现以某种形式提供它们。关于它们在运行时的where 的细节是实现定义的,但访问 to 它们是标准定义的。它们的生命周期和行为同样由标准定义:
C++11 § 27.4.1(2)
在第一次构造 ios_base::Init 类的对象之前或期间,以及在任何情况下,在
main的主体开始执行之前的某个时间构造对象并建立关联。 294 程序执行过程中对象不会被销毁。295 在翻译单元中包含<iostream>的结果应该就像<iostream>定义了一个静态存储的ios_base::Init的实例期间。同样,整个程序的行为就好像至少有一个具有静态存储持续时间的ios_base::Init实例。
【讨论】:
在由编译器驱动程序自动链接到您的可执行文件的库中(例如 g++ 或 clang++)。
【讨论】:
它是 istream 类的对象。因此,当您使用 cin 时,您只需创建一个 istream 类型的对象。
它具有外部链接和静态持续时间。
标准输入流是由环境决定的字符源。通常假定它是从外部源输入的,例如keyboard 或file。
作为istream 类的对象,可以使用提取运算符(operator>>) 将字符作为格式化数据检索,也可以使用read 等成员函数将字符检索为未格式化数据。
【讨论】: