法大奥山研究室

 previous  contents

16.3. リンケージ(結合)


 プログラム中に同じオブジェクト名や関数名で複数の宣言があるとき,それらが同一のオブジェクト,或いは関数として参照されることをリンケージあるいは結合と言います。

■結合(リンケージ,Linkage)[C99, 6.2.2]

リンケージは,有効範囲と記憶域クラスで決まります。

記憶域クラスデータ有効範囲リンケージ
指定なしオブジェクトファイル・スコープ外部結合
ブロック・スコープなし
関数ファイル・スコープexternと同じ。
ブロック・スコープ
staticオブジェクトファイル・スコープ内部結合
ブロック・スコープなし
関数ファイル・スコープ内部結合
externオブジェクト,
関数
ファイル・スコープ可視な宣言済みの同一識別子がリンケージをもつ場合,それと同じリンケージを持たせる。可視な宣言済みの同一識別子がない,或いは存在してもそれがリンケージを持たない場合,外部結合を持つこととなる。
ブロック・スコープ
* 「ファイル・スコープ」,「ブロック・スコープ」,「可視」については「16.1. 変数の有効範囲」を参照。

extern を付さないブロック・スコープのオブジェクトは,リンケージなし(無結合,No Linkage)となります。[C99, 6.2.2, 6]

■リンケージがある場合の初期化ルール

/* Example 16.3 */

char c = 'A';
static double pi = 3.14;

int main(void)
{
       extern double x;
       char c;
       static long l;
}

最初の char型変数 c はファイル・スコープを持ち,記憶域クラスの指定がありません。したがって,外部結合を持ちます。double型変数 pi はファイル・スコープを持ち,記憶域クラスには static を指定しています。したがって,内部結合をもちます。外部結合はないので,宣言されているソースファイルのみのリンケージとなります。変数 x は,宣言済みの同一変数がないので外部結合を持ちます。これには外部定義が必要です。また,ブロック・スコープを持つので初期化はできません。main関数内の変数 c は,3行目で宣言している変数 c を隠すので,それとは異なる無結合変数として認識されます。同一と認識させるには,変数の宣言を削除するか,3行目の変数 c がリンケージを持っているので extern を付せば良いです。変数 l は記憶域クラスに static を付していますが,ブロック・スコープをもつため,リンケージをもちません。


 previous  contents