インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
このトピックは、Linux* および macOS* 向けの C/C++ アプリケーションにのみ適用されます。
グローバルシンボルは、宣言されたコンパイル単位 (単一ソースファイルとそのインクルード・ファイル) 外で見ることができるシンボルです。C/C++ では、 static キーワードのないファイルレベルでの宣言を意味します。次に例を示します。
int x = 5; // グローバルデータの定義
extern int y; // グローバルデータの参照
int five() // グローバル関数の定義
{ return 5; }
extern int four(); // グローバル関数の参照
最終的なプログラムは、メインプログラムとメインプログラムによって参照されるデータおよび関数の定義を含む複数の共有可能なオブジェクト・ファイル (.so) から構成されます。 共有可能なオブジェクトは、他の共有可能なオブジェクトで定義されているデータや関数を参照することもあります。同時に実行している複数のプロセスの仮想メモリーに共有可能なオブジェクトがマップされている場合、物理メモリーにはそのオブジェクトの読み取り専用部分が 1 つだけ存在するため、これらのオブジェクトは共有可能なオブジェクトと呼ばれます。メイン・プログラム・ファイルとそのファイルが参照する共有可能なオブジェクトを、プログラムのコンポーネントと呼びます。
コンパイル単位中の各グローバルシンボル定義や参照には、それらが定義されているコンポーネント以外からの参照方法を制御する可視属性があります。可視属性の値は 5 つあります。
EXTERNAL - コンパイラーはシンボルを別のコンポーネントで定義されたものとして扱います。定義の場合、コンパイラーは、別のコンポーネントにある同じ名前の定義によってシンボルが無効にされる (プリエンプトされる) と仮定します。「シンボル・プリエンプション」を参照してください。関数シンボルの可視属性が external の場合、コンパイラーはそのシンボルが間接的に呼び出され、間接呼び出しスタブをインライン展開できることを知っています。
DEFAULT - ほかのコンポーネントはシンボルを参照することができます。シンボル定義は、別のコンポーネントにある同じ名前の定義によって無効に (プリエンプト) されます。
PROTECTED - ほかのコンポーネントはシンボルを参照することができますが、別のコンポーネントにある同じ名前の定義によってプリエンプトすることはできません。
HIDDEN - ほかのコンポーネントはシンボルを直接参照することはできません。しかし、そのアドレスは間接的に (例えば、別のコンポーネントの関数への呼び出し引数として、または別のコンポーネントの関数で参照されるデータに格納して) 他のコンポーネントに渡すことができます。
INTERNAL - シンボルは、シンボルが定義されているコンポーネント以外から、直接的にも間接的にも参照することはできません。
通常、スタティックなローカルシンボル (C/C++ では、ファイルスコープで宣言されているシンボル、またはキーワード static とともに宣言されているシンボル) の可視属性は HIDDEN です。ほかのコンポーネント (または同じコンポーネント内のほかのコンパイル単位) から直接参照することはできませんが、間接的に参照することはできます。
可視属性は定義にも参照にも適用されます。シンボル参照の可視属性は、対応する定義にその可視属性が適用されることを意味します。