Extern

1479 ワード

1、externはC/C++言語で関数とグローバル変数の作用範囲(可視性)を示すキーワードであり、このキーワードはコンパイラに宣言された関数と変数が本モジュールまたは他のモジュールで使用できることを示す.
2、例えば、モジュールBがモジュールAに定義されたグローバル変数と関数を参照しようとする場合、モジュールAのヘッダファイルを含めるだけでよい.このように、モジュールBでモジュールAの関数を呼び出すと、コンパイル段階では、モジュールBはその関数が見つからないが、エラーは報告されない.この関数は、リンクフェーズでモジュールAコンパイルによって生成されたターゲットコードから検出されます.
3、extern「C」で修飾された変数と関数はC言語でコンパイルされリンクされている
ある関数のプロトタイプをvoid foo(int x,int y);この関数はCコンパイラによってコンパイルされたシンボルライブラリの名前は_foo、C++コンパイラは像_を生成しますfoo_int_intなどの名前(コンパイラによって生成される可能性のある名前は異なるが、同じメカニズムを採用しており、生成される新しい名前を「mangled name」と呼ぶ).foo_int_intという名前には,関数名,関数パラメータ数,タイプ情報が含まれており,C++はこのようなメカニズムによって関数リロードを実現している.例えば、C++では、関数void foo(int x,int y)とvoid foo(int x,float y)のコンパイルによって生成される符号は異なり、後者は_foo_int_float.
4、例(1)extern“C”宣言を付けない場合の接続方法を説明する.C++において、モジュールAのヘッダファイルは以下のように仮定する.
//   A    moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif

//   B      :
//   B     moduleB.cpp
#include "moduleA.h"
foo(2,3);

接続フェーズでは、リンクは、モジュールAから生成するターゲットファイルmoduleAから生成される.objで探す_foo_int_intという記号!