Sun Studio 12: C++ ユーザーズガイド

4.1 リンカースコープ

次の宣言指定子を、外部シンボルの宣言や定義の制約のために使用します。静的なアーカイブやオブジェクトファイルに対して指定したスコープは、共有ライブラリや実行可能ファイルにリンクされるまで、適用されません。しかしながら、コンパイラは、与えられたリンカースコープ指定子に応じたいくつかの最適化を行うことができます。

これらの指定子を使用することで、リンカースコープのためにマップファイルを使う必要がなくなります。 -xldscope をコマンド行で指定することによって、変数スコープのデフォルト設定を制御することもできます。

詳細は、「A.2.133 -xldscope={v}」を参照してください。

表 4–1 リンカースコープ宣言指定子

値 

意味 

__global

シンボル定義には大域リンカースコープとなります。これは、もっとも限定的でないリンカースコープです。シンボル参照はすべて、そのシンボルが定義されている最初の動的ロードモジュール内の定義と結合します。このリンカースコープが、extern 外部シンボルのデフォルトのリンカースコープです。

__symbolic

シンボル定義は、シンボリックリンカースコープとなります。これは、大域リンカースコープより限定的なリンカースコープです。リンク対象の動的ロードモジュール内からのシンボルへの参照はすべて、そのモジュール内に定義されているシンボルと結合します。モジュール外については、シンボルは大域なものとなります。このリンカースコープは、リンカーオプション -Bsymbolic に対応しています。C++ ライブラリでは -Bsymbolic を使用できませんが、__symbolic 指定子は問題なく使用できます。リンカーの詳細については、ld(1) を参照してください。

__hidden

シンボル定義は、隠蔽リンカースコープとなります。隠蔽リンカースコープはシンボリックリンカースコープや大域リンカースコープよりも限定的なリンカースコープです。動的ロードモジュール内の参照はすべて、そのモジュール内の定義に結合します。モジュール外からは、シンボルは見えません。

より限定的な指定子を使ってシンボル定義を宣言しなおすことはできますが、より限定的でない指定子を使って宣言しなおすことはできません。いったん定義したシンボルを別の指定子によって宣言することはできません。

__global はもっとも限定的でないスコープ、__symbolic はそれよりも限定的なスコープであり、__hidden はもっとも限定的なスコープです。

仮想関数の宣言は仮想テーブルの構造と解釈に影響を及ぼすので、あらゆる仮想関数は、クラス定義を含んでいるあらゆるコンパイル単位から認識される必要があります。

C++ クラスでは、仮想テーブルや実行時型情報といった暗黙の情報の生成が必要と なることがあるため、 構造体、クラス、および共用体の宣言と定義にリンカースコープ指定子を適用できるようになっています。その場合、指定子は、構造体、クラス、または共用体キーワードの直後に置きます。こういったアプリケーションでは、すべての暗黙のメンバーに対して 1 つのリンカースコーピングが適用されます。