1. 単一定義ルール
C++ には
「単一定義ルール」( One Definition Rule 、ODR )
があり、次のように規定されています。
変数は 1 回だけ定義できます。このニーズを満たすために、
C++ では
2 つの変数宣言が提供されています。一
1 つは変数に記憶領域を割り当てる定義宣言 (定義) で、もう 1 つは既存の変数を参照するため、変数に記憶領域を割り当てない参照宣言 (または単に宣言) です。
参照宣言ではキーワード
externが使用され
、初期化されません。
注: プログラム内に同一の変数名が複数存在する場合、コンパイル時にエラーが報告されますが、以下の方法で回避できます。
1. extern キーワードを使用する
2. 名前空間
ネームスペース を使用する
3. static を使用して変数を変更します。static 修飾子により変数がこのファイルに限定され、対応するグローバル定義が上書きされます (つまり、static で変更された変数は内部リンクであり、原理は 2 と同様であり、スコープは制限されています)
2. 使用例
ファイル1.cpp
#include <iostream>
int tom=3;
using namespace std;
int main()
{
cout <<"file1.cpp &tom"<<&tom<<",,,,tom="<<tom<<endl;
remote_access();
cout <<"file1.cpp &tom"<<&tom<<",,,,tom="<<tom<<endl;
return 0;
}
ファイル2.cpp
#include <iostream>
extern int tom;
//extern int tom=5;//这里这样重新初始化编译会报错
//static int tom=4; //使用static修饰的变量,具有内部链接性,该变量限制在file2.cpp中使用,也可行
void remote_access()
{
using namespace std;
tom=5;//这样重新赋值可以,而且file1.cpp的tom变量值也被修改成了5
cout <<"file2.cpp &tom"<<&tom<<",,,,tom="<<tom<<endl;
}
上記 2 つのファイルをコンパイルします。 g++ file1.cpp file2.cpp -o test
プログラムの実行結果は次のとおりです。
file1.cpp &tom0x403010,,,,tom=3
remote_access() reports the follwing addresses:
file2.cpp &tom0x403010,,,,tom=5
file1.cpp &tom0x403010,,,,tom=5