logo

C の extern キーワード

C の extern キーワードは、C 変数 (データ オブジェクト) と C 関数に適用されます。基本的に、extern キーワードは C 変数と C 関数の可視性を拡張します。おそらくそれがexternと名付けられた理由です。

おそらくほとんどの人は、変数または関数の宣言と定義の違いを理解していると思いますが、完全を期すために、それを明確にしましょう。



    変数または関数の宣言は、変数または関数がプログラム内のどこかに存在することを単に宣言するだけですが、メモリはそれらに割り当てられません。変数または関数の宣言は重要な役割を果たし、その型が何になるかをプログラムに伝えます。の場合 関数 宣言に加えて、引数、そのデータ型、それらの引数の順序、関数の戻り値の型もプログラムに伝えます。宣言については以上です。
  • に来ています 意味 、私たちが 定義する 変数または関数の場合、宣言が行うすべての処理に加えて、その変数または関数にメモリも割り当てられます。したがって、定義を宣言のスーパーセット (または宣言のサブセット) として考えることができます。
  • Extern は外部の短縮名です。
  • extern 変数は、特定のファイルが別のファイルの変数にアクセスする必要がある場合に使用されます。

C の extern の構文

C で extern 変数を定義する構文は、変数宣言の前に extern キーワードを使用するだけです。

extern data_type variable_name;>

C の extern 変数の例

C




リストのインデックス





#include> > extern> int> a;>// int var; ->宣言と定義>>' // extern int var; ->宣言>> int> main()> {> >printf>(>'%d'>, a);> > >return> 0;> }>

>

>

C の extern 変数のプロパティ

  • extern some_data_type some_variable_name; と書くと、メモリは割り当てられていません。変数のプロパティのみが発表されます。
  • ファイル内で extern 変数を複数宣言できます。自動変数の場合はそうではありません。
  • extern 変数は、コンパイラーに対して、「私のスコープの外に出れば、私が宣言した変数の定義が見つかるでしょう」と指示します。
  • コンパイラは、extern 変数の内容がすべて true であると信じており、エラーは生成されません。リンカは、そのような変数が存在しないことが判明するとエラーをスローします。
  • extern 変数が初期化されると、この変数用のメモリが割り当てられ、定義されているとみなされます。

変数または関数は次のようになります。 宣言された 何度でも可能ですが、 定義済み 1回だけ。 (同じ変数または関数を 2 つの場所に置くことはできないという基本原則を思い出してください)。
ここで extern キーワードに戻ります。まず、関数での extern の使用について考えてみましょう。関数が宣言または定義されると、暗黙的に extern キーワードが想定されることがわかります。書くとき。

int foo(int arg1, char arg2);>

コンパイラはそれを次のように扱います。

extern int foo(int arg1, char arg2);>

extern キーワードは関数の可視性をプログラム全体に拡張するため、ファイルに関数の宣言が含まれていれば、プログラム全体のどのファイルでも関数を使用 (呼び出し) できます。 (関数の宣言が行われると、コンパイラーは関数の定義が別の場所に存在することを認識し、先に進んでファイルをコンパイルします)。 extern と関数については以上です。
次に、変数での extern の使用を考えてみましょう。まず、どうしますか 宣言する のない変数 定義する それ?次のようなことを行うとします。

extern int var;>

ここでは、var という整数型変数が宣言されています (まだ定義されていないため、現時点では var に対するメモリ割り当ては行われていません)。そして、この宣言は何度でも行うことができます。
さて、どうしますか 定義する ヴァール?次のようにします。

int var = 10;>

この行では、var という整数型変数が宣言されています。 そして 定義されています(覚えておいてください) 意味 のスーパーセットです 宣言 )。これは 意味 、var のメモリも割り当てられます。ここで驚きが起こります。関数を宣言/定義したときに、 extern キーワードが暗黙的に存在していることがわかりました。しかし、変数の場合はそうではありません。そうであった場合、メモリはそれらに割り当てられることはありません。したがって、変数を定義せずに宣言したい場合は、明示的に extern キーワードを含める必要があります。また、 extern キーワードは可視性をプログラム全体に拡張するため、 extern キーワードを変数とともに使用することで、変数がどこかに定義されている宣言を含めれば、プログラム内のどこでも変数を使用できます。
それでは、例を挙げて extern を理解してみましょう。

例 1:

c


ラテックスでテーブルを作成する



int> var;> int> main(>void>)> {> >var = 10;> >return> 0;> }>

>

>

このプログラムは正常にコンパイルされます。 var はグローバルに定義 (そして暗黙的に宣言) されます。

例 2:

c




extern> int> var;> int> main(>void>)> {> >return> 0;> }>

>

Javaの逆文字列

>

このプログラムは正常にコンパイルされます。ここでは var のみが宣言されています。 var は決して使用されないため、問題は発生しません。

例 3:

c




extern> int> var;> int> main(>void>)> {> >var = 10;> >return> 0;> }>

>

>

var は宣言されているもののどこにも定義されていないため、このプログラムはコンパイル時にエラーをスローします (リンク段階中、詳細はこちらを参照)。基本的に、var にはメモリが割り当てられません。そしてプログラムは、まったく存在しない変数の値を 10 に変更しようとしています。

例 4:

c




// As we are importing the file and henceforth the> // defination> #include 'somefile.h'> > // Declaring the same variable> extern> int> var;> >// int var;> >// It will throw compiler error as compiler will get> >// confused where the variable is defined> > int> main(>void>)> {> >var = 10;> >return> 0;> }> > // Now it will compile and run successfully>

Javaのstring.replaceall

>

>

出力:

10>

注記: ここで、上記のコード スニペットで extern を宣言しなかった場合はどうなるかという別のシナリオが生じます。

somefile.h に var の定義が含まれていると仮定すると、このプログラムは正常にコンパイルされます。 「extern」キーワードは、あるファイルで変数を宣言し、別のファイルで定義するときに変数に使用されます。しかし、ここで宣言されているファイルに同じファイルをインポートすると、ここでコンパイルエラーが発生します。

これは、この変数が別の場所で定義されていることをコンパイラに伝えるために、その変数を宣言したファイル内で extern キーワードを使用する必要があり、新しいメモリ領域が割り当てられるだけではなく、別のメモリ ブロックが作成されるためです。 「extern」キーワードの使用法は役に立ちません。

例 5:

c




制御構造Python
extern> int> var = 0;> int> main(>void>)> {> >var = 10;> >return> 0;> }>

>

>

このプログラムはうまくいくと思いますか?さて、C 標準からまた驚くべきことが起こりました。彼らは、変数が宣言されているだけで、その宣言とともにイニシャライザも提供されている場合、その変数のメモリが割り当てられる、つまり、その変数は定義されているものとみなされます。したがって、C 標準に従って、このプログラムは正常にコンパイルされ、機能します。
以上、C の extern キーワードについての予備的な説明でした。

要するに、次のように言えます。

  1. 宣言は何度でも行うことができますが、定義は 1 回だけです。
  2. extern キーワードは、変数/関数の可視性を拡張するために使用されます。
  3. 関数はデフォルトでプログラム全体で表示されるため、関数の宣言または定義で extern を使用する必要はありません。その使用は暗黙的です。
  4. extern を変数とともに使用する場合、変数は宣言されるだけで、定義されません。
  5. 例外として、初期化で extern 変数が宣言されている場合、それも変数の定義として扱われます。