- expectとconsumeの違いは?
- error報告のためのラッパー関数
- externでグローバル変数を宣言する。
- いずれかのCファイルで定義する。
- 重複するとエラーになると書いてあるが、ならないのはなぜ?
- gccでは許されているっぽい
-fno-commonをつけるとコンパイル(リンク)エラーになった
- ヘッダーファイルに「宣言」ではなく「定義」を書いてはいけない?
- 上と同じくgccでは許されている?
- 参考: http://solid.kmckk.com/doc/skit/current/solid_toolchain/overview.html
-
定義: データの置き場
-
宣言: コンパイラに居場所を教える
-
ヘッダーに宣言を定義できるが、ヘッダーを複数ファイルでincludeするとエラーが発生するはず。しかし、起きない。
- 初期化式がないとエラーが起きないのは特別な動作
- CommonSymbolという特別なSymbolにする機能がリンカにある。
- CommonSymbolは重複を許容する。
- Fortran由来の機能(かも)
- 初期化式なしのグローバル変数は複数定義されても良い機能が
- 作法としては
- 設定をoverrideしてCommonSymbolにしないようにできる
- 基本は-fno-commonつきでコンパイルするのがよい。
-
リンカのデフォルト動作では、初期化式なしのグローバル変数は複数箇所に定義されていた場合もリンク可能
-
初期化式なしのグローバル変数はオブジェクトファイル内でCommonSymbolとして扱われる。
-
CommonSymbolは通常のSymbolと異なり、重複を許容する。
-
Fortranなどから由来した機能?
-
グローバル変数の複数箇所定義はC言語の作法としてはよろしくないので、基本は-fno-commonオプションをつけてコンパイルするのが良い