2017-05-07 388 views
1

複数の.cファイルで構造体をアクセス可能にするためにexternを使用できないのはなぜですか?C言語の構造体にexternを使用する

私は、structの定義を.hファイルに入れ、その.hファイルをすべての.cファイルに含めることをお勧めします。私たちはその構造体を使用しますが、なぜexternを変数として使用できますか?構造体?変数がどこにある

  1. が、我々はそれが
  2. ビルド.cファイルの両方を使用することにしたい.Cファイルに.Cファイルに1を
  3. のextern変数を変数を定義します。extern変数に

    定義されているものと使用されているもの

しかし、どのような構造の場合ですか?

どこか間違っている場合は私を修正してください。

+0

Cは断片的なコンパイル用に設計されているため、別々のファイルをコンパイルしてから一緒に作成することができます。構造体を使用するには、そのメンバにアクセスするコードが含まれます。構造体定義がそれほど後で利用できない場合、そのコードはどのように放出されるのでしょうか? – StoryTeller

+1

変数は(実行時に)記憶域を持つものです。したがって、 'extern'と' static'はリンカが同じ名前(extern')または別個のストレージ( 'static')を持つ2つのシンボルを与えるためのヒントです。 (これはあなたが想像する方法です - 標準では別の言葉で言います...)しかし、型(例えば 'struct')はコンパイル時に評価されます。コードが使用されるまで(例えば、変数内で)コードを生成しません。したがって、ストレージクラス(externやstaticなど)は型に影響を与えません。タイプを共有したい場合は、すべてのCファイルで再定義してください(たとえば、 – Scheff

+1

... Cファイルに含まれているヘッダーに入れてください)。 – Scheff

答えて

2

ストレージクラス指定子externは、リンケージ(C11 draft 6.2.2を参照)を制御するために使用されます。すなわち、どの識別子が同じオブジェクトまたは機能を参照しているかを示します。

structただし、定義(関数のオブジェクトまたは関数本体の格納予約、6.7.5参照)ではなく、型宣言(6.2.5.20および6.7.2.1.6を参照)です。


備考:この区別は6.2.2.6に明示的にも行われる。

次識別子は全く結合を有さない: に宣言された識別子は、オブジェクトまたは関数以外のものです。 ...

関連する問題