- 内部結合 : Internal Linkage
- 外部結合 : External Linkage
ファイルスコープのオブジェクト定義(いわゆるグローバル変数定義)
static | 記憶クラス指定子なし | extern | |
C言語 | 内部結合定義 | 外部結合定義 | 仕様なし |
C++ | 内部結合定義 | 非const: 外部結合定義 const: 内部結合定義 |
外部結合定義 |
グローバル変数の定義
記憶域クラス指定子なし
1 |
int global_variable = 0; |
- C言語は無条件に外部結合定義
- したがってC言語では "
extern int global_variable = 0;
" のような書き方はしない(仕様未定義)
- したがってC言語では "
- C++
- 非constグローバル変数は外部結合定義
- constグローバル変数は内部結合定義
static記憶域クラス
1 |
static int internal_variable = 0; |
- C言語もC++も内部結合定義
extern記憶域クラス
1 |
extern int external_variable = 0; |
- C++は外部結合定義 (const, 非constに関わらず)
- C言語
- 定義にextern修飾したときの仕様は未定義
- extern修飾子は(外部結合)宣言のキーワード
グローバル変数の仮定義
1 |
int global_variable; |
- 初期化しないときは『仮定義』である。
- ただ一つの『仮定義』しか存在しないときは、イコール『定義』とみなす。
- 複数の翻訳単位(コンパイル・オブジェクト単位)に複数の仮定義が存在するときは、どれか一つを『定義(definition)』とみなし、他は『宣言(declaration)』とみなす。
- const修飾したグローバル変数は『仮定義』ではなく、常に『定義』とみなされる。そこで、複数の翻訳単位(たとえばヘッダーファイル)に重複する定義を記述するとコンパイルエラー(多重定義)となる。