当我尝试查看 cout 的定义时,我登陆 iostream 文件,它被声明为,
extern _CRTDATA2 ostream cout;
那么它是在哪里定义的呢?因为 extern 只是声明而不是定义。
全局符号在您与应用程序链接的运行时库中定义。例如,在您传递将您的应用程序与库链接gcc
的编译器选项。那是所有这些符号所在的地方。-lstdc++
libstdc++.a
不过,这特定于您的编译器/运行时库版本,并且会有所不同。Microsoft Visual C++ 的行为可能不同,但想法是相同的:符号位于 C++ 编译器随附的预编译库中。
使用 GNU,您可以键入:
nm -g libstdc++.a
查看库中的符号。输出可能如下所示(在许多其他行中):
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