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