externの使い方の詳細

2074 ワード

C言語では、修飾子externは、変数または関数の宣言の前に「この変数/関数は別の場所で定義されており、ここで参照する」ことを説明するために使用されます.(externは、変数または関数の前に配置して、変数または関数の定義を別のファイルに表示し、コンパイラがこの変数と関数に遭遇したときに他のモジュールで定義を探すように促すことができます)
たぶんexternの使い方は次のような方法です.
主な使い方は次のとおりです.
  • このファイルに他のファイルの変数を宣言する場合extern
  • を使用します.
  • cppプログラムファイルでcのライブラリ関数を使用する場合extern
  • ヘッダファイルh
    次に、
    extern volatile SERV103_LINK servLink;
    	extern YaoXinStrucType *pstYx;
    	static int ycSpace = 500;
    	static int yxSpace = 1000;
    	static int sjbgSpace = 10*1000;
    	static int gzbgSpace = 30*1000;
    が必要である.cppファイルでの参照
    ある人cpp(複数のcpp)
    iec103_serv_send_sjbg((SERV103_LINK *)&servLink ,sjbgData, 1);
    ST_RET iec103_serv_send_zjbg(SERV103_LINK *servLink, SoeItemType *zjbgData, ST_UCHAR sendReason);
    説明:私は異なるcppで呼び出します.
    1.extern修飾変数の宣言.例えば、ファイルa.cがb.cの変数int vを参照する必要がある場合、a.cでextern int vを宣言し、変数vを参照することができる.ここで注意しなければならないのは、参照される変数vのリンク属性は、外部リンクでなければならない(external)の、すなわちa.cがvに参照するのは、a.cでextern int vを宣言するだけでなく、変数v自体が参照可能であることにも依存する.これは、c言語のもう一つの話題である変数の役割ドメインにかかわる.他のモジュールでextern修飾子で参照できる変数は、通常、グローバル変数である.また、extern int vは、a.cのどこにでも置くことができます.例えば、a.cの関数fun定義の先頭でextern int vを宣言し、変数vに参照することができます.ただ、関数funの役割ドメインでvを参照するしかありません.これは変数の役割ドメインの問題です.この点については、多くの人が使っているときに心配している.extern宣言はファイルの役割ドメインにのみ使用できるようです.
    関数と変数は同じです:(上の例は関数で使用します)
    2.extern修飾関数宣言.本質的には変数と関数に違いはありません.関数名は、関数バイナリブロックの先頭にあるポインタです.ファイルa.cがb.cの関数を参照する必要がある場合、例えばb.cのプロトタイプがint fun(int mu)である場合、ではa.cでextern int fun(int mu)を宣言し、funを使って何でもできるようにします.変数の宣言のようにextern int fun(int mu)a.cのファイルの役割ドメインの範囲に置く必要はなく、a.cのどこにでも置くことができます.他のモジュールの関数への参照は、これらの関数が宣言するヘッダファイルを含むのが最も一般的な方法です.externとヘッダファイルを含む関数を参照するのはどのような違いがありますか?externの参照方式はヘッダファイルを含むよりずっと簡潔です!externの使用方法は直接的に、どの関数を参照したいかexternでどの関数を宣言します.これはKISSの原則の一つの体現だろう.このような明らかな利点は、プログラムのコンパイル(正確には前処理)のプロセスを加速させ、時間を節約することである.大規模なCプログラムのコンパイルの過程で、この違いは非常に明らかである.
    3.さらに、extern修飾子は、CまたはC++関数の呼び出し仕様を示すために使用することができる.たとえばC++でCライブラリ関数を呼び出すには,C++プログラムでextern"C"で参照する関数を宣言する必要がある.これはリンクに使うもので、リンクにリンクするときにC関数仕様でリンクするように伝えます.主な理由は,C++とCプログラムのコンパイルが完了すると,ターゲットコードでネーミングルールが異なるためである.