C++ cout在iostream中声明,但它在哪里定义?

C++ cout在iostream中声明,但它在哪里定义?,c++,stl,C++,Stl,当我试图查看cout的定义时,我进入iostream文件,其中声明为 extern _CRTDATA2 ostream cout; 那么它的定义是什么呢?因为extern只是声明而不是定义 全局符号在与应用程序链接的运行时库中定义。例如,在gcc中,传递编译器选项-lstdc++,该选项将应用程序链接到libstdc++.a库。这就是所有这些符号所在的地方 不过,这是特定于编译器/运行时库版本的,并且会有所不同。微软Visual C++可能有不同的行为,但想法是相同的:符号位于C++编译器中传

当我试图查看cout的定义时,我进入iostream文件,其中声明为

extern _CRTDATA2 ostream cout;

那么它的定义是什么呢?因为extern只是声明而不是定义

全局符号在与应用程序链接的运行时库中定义。例如,在
gcc
中,传递编译器选项
-lstdc++
,该选项将应用程序链接到
libstdc++.a
库。这就是所有这些符号所在的地方

不过,这是特定于编译器/运行时库版本的,并且会有所不同。微软Visual C++可能有不同的行为,但想法是相同的:符号位于C++编译器中传递的预编译库中。 使用GNU,您可以键入:

nm -g libstdc++.a
查看库中的符号。输出可能如下所示(在许多其他行中):


在标准库的源代码中,而不是头文件中的某个地方,可能?@ Mat是STL开源?有几个C++标准库的开源实现。我不知道你是否在使用它们中的一个。标准库不是STL。STL是许多标准库的发源地,但两者有很大不同。请阅读本文。编写
std::
时,引用定义标准库的命名空间。
ios_init.o:
                 U _ZSt3cin
globals_io.o:
0000000000000000 D _ZSt3cin
0000000000000000 D _ZSt4cerr
0000000000000000 D _ZSt4clog
0000000000000000 D _ZSt4cout
0000000000000000 D _ZSt4wcin
0000000000000000 D _ZSt5wcerr
0000000000000000 D _ZSt5wclog
0000000000000000 D _ZSt5wcout