複数のファイルを共有するときに「extern」を「extern」で飾る必要がない理由

StackOverflow https://stackoverflow.com//questions/24043974

  •  21-12-2019
  •  | 
  •  

質問

C ++本を読みながら、const変数/オブジェクトを複数のファイルに共有するには、const変数をファイルの1つに定義し、それが使用されている各ソースファイルでそれを宣言する必要があることを学びました。たとえば、

です

file1.cppでは、

のようにグローバルにconst int変数を定義します。
extern const int ca = 100;
.

file2.cppでそれを使用する場合は、この変数を

のように宣言します。
extern const int ca;
.

上記の条約は私にとって完璧な理にかなっています。ただし、const charポインタに着信すると、externを使用して定義する必要はなく、複数のファイルを非常によく交差させることができます。なぜそのようなことが起こるのですか?たとえば、

です

file1.cppでは、

のようにグローバルにconst charポインタ変数を定義します。
const char *cstr = "hello";
.

file2.cppでそれを使用する場合は、この変数を

のように宣言します。
extern const char *cstr;
.

私の質問をより具体的にするために、File1.cppの "extern"で装飾されていなくてもfile2.cppでCSTRを使うことができますか?

感謝

役に立ちましたか?

解決

問題はリンケージの一つです。変数を定義すると 名前空間の範囲、そして以前の宣言はありません。 コントロールがない場合は、リンケージを確立します。 const、内部の場合だからあなたが書くとき:

int const ca = 100;
.

ソースファイルでは、リンケージは内部、およびエンティティになります (変数)caはその翻訳に固有のものになることを指します。 単位。書いたら:

int ca = 100;
.

リンケージは外部になるので、

extern int ca;
.

別の翻訳単位では、同じ変数を参照します。

、もちろん、書くとき:

char const* cstr = "hello";
.

あなたはconstではないポインタを定義しています(それは constを指します。

もちろん、通常はヘッダー内の変数を宣言します。 externを使用すると、あなたが宣言されたときに以前の宣言があるでしょう 変数を定義し、最初の宣言です。 リンケージを確立します。

他のヒント

externは、ステートメント "extern const chart"を明示的にするために使用されます。定義は宣言であり、CSTRは他の場所に定義されています。「char char * cstr」をした場合コンパイラは定義として解釈され、2つのCSTR変数になります。

extern on "const chart * cstr=" hello "を適用した場合初期化によって実際に変数を定義しているため、コンパイラはそれを無視します。

詳細: http://en.wikipedia.org/wiki/external_variable

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top