[C/C++] 内部結合と外部結合

  • 内部結合 : Internal Linkage
  • 外部結合 : External Linkage

ファイルスコープのオブジェクト定義(いわゆるグローバル変数定義)

  static 記憶域指定子なし extern
C言語 内部結合定義 外部結合定義 仕様なし
C++ 内部結合定義 非const: 外部結合定義
const: 内部結合定義
外部結合定義

 

グローバル変数の定義

記憶域クラス指定子なし

  • C言語は無条件に外部結合定義
    • したがってC言語では "extern int global_variable = 0;" のような書き方はしない(仕様未定義)
  • C++
    • 非constグローバル変数は外部結合定義
    • constグローバル変数は内部結合定義

static記憶域クラス

  • C言語もC++も内部結合定義

extern記憶域クラス

  • C++は外部結合定義 (const, 非constに関わらず)
  • C言語
    • 定義にextern修飾したときの仕様は未定義
    • extern修飾子は(外部結合)宣言のキーワード

グローバル変数の仮定義

    • 初期化しないときは『仮定義』である。
    • ただ一つの『仮定義』しか存在しないときは、イコール『定義』とみなす。
    • 複数の翻訳単位(コンパイル・オブジェクト単位)に複数の仮定義が存在するときは、どれか一つを『定義(definition)』とみなし、他は『宣言(declaration)』とみなす。
    • const修飾したグローバル変数は『仮定義』ではなく、常に『定義』とみなされる。そこで、複数の翻訳単位(たとえばヘッダーファイル)に重複する定義を記述するとコンパイルエラー(多重定義)となる。