複数のファイルを共有するときに「extern」を「extern」で飾る必要がない理由
質問
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 "を適用した場合初期化によって実際に変数を定義しているため、コンパイラはそれを無視します。