Skip to content

Latest commit

 

History

History
36 lines (31 loc) · 2 KB

File metadata and controls

36 lines (31 loc) · 2 KB

compilerbookノート

疑問点

ステップ3

  • expectとconsumeの違いは?
    • error報告のためのラッパー関数

ステップ8

  • 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オプションをつけてコンパイルするのが良い