グローバルシンボルと可視属性

グローバルシンボルは、宣言されたコンパイル単位 (単一ソースファイルとそのインクルード・ファイル) の外部で見えるシンボルです。C/C++ では、これは static キーワードのないファイルレベルでの宣言を意味します。次に例を示します。

int x = 5;         // global data definition

extern int y;      // global data reference

int five()         // global function definition

{ return 5; }

extern int four(); // global function reference

完成したプログラムは、メインプログラムとメインプログラムによって参照されるデータおよび関数の定義を含む複数の共有可能なオブジェクト (.so) ファイルから構成されます。同様に、共有可能なオブジェクトは他の共有可能なオブジェクトで定義されているデータや関数を参照します。同時に実行している複数のプロセスがその仮想メモリーにマップされた共有可能なオブジェクトを含む場合、物理メモリーにはそのオブジェクトの読み取り専用部分の 1 つのコピーのみが存在するため、これらのオブジェクトは共有可能なオブジェクトと呼ばれます。メイン・プログラム・ファイルとそのファイルが参照する共有可能なオブジェクトは、プログラムのコンポーネントと呼ばれます。

コンパイル単位中の各グローバルシンボル定義や参照には、それらが定義されたコンポーネントの外部からどのように参照されるかを制御する可視属性があります。可視属性の値は 5 つあります。

スタティックなローカルシンボル (C/C++ では、ファイルスコープでの宣言またはキーワード static による宣言) の通常の可視属性は HIDDEN で、他のコンポーネント (または同じコンポーネント内の他のコンパイル単位) から直接参照することはできませんが、間接的に参照することはできます。

可視属性は定義にも参照にも適用されます。シンボル参照の可視属性は、対応する定義にその可視属性が適用されるというアサーションです。