C++の静的永続化の外部連携 --- 通常のメンバ変数、変数単一定義ルールとexternの使用例

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

おすすめ

転載: blog.csdn.net/banzhuantuqiang/article/details/130910468