C++キーワードのstaticとextern

2000 ワード

static修飾のオブジェクトによって、staticキーワードは主に以下の役割を果たします.
1.生存期間の延長:
一般に、ローカル変数はスタック領域に格納され、ローカル変数のライフサイクルは文ブロックの実行が終了すると終了する.しかしstaticで修飾すると,この変数は静的データ領域に格納され,プログラム実行全体が終了するまでライフサイクルが続く.しかし、ここで注意しなければならないのは、staticでローカル変数を修飾した後、そのライフサイクルおよび記憶空間が変化したが、その役割ドメインは変化せず、依然としてローカル変数であり、役割ドメインは文ブロックに限られていることである.
局所変数をstaticで修飾した後、この変数は初回実行時にのみ初期化動作を行い、一度のみ行う.
#include

void fun()
{
staticint a=1;
a++;
printf("%d
",a); } int main(void) { fun(); fun(); return0; }

実行結果:2、3
2.役割ドメインの変更:
グローバル変数の場合、元のソースファイルにアクセスしたり、同じプロジェクトの他のソースファイルにアクセスしたりできます(externで宣言するだけです).次のようになります.
file1.c

int a=1;

file2.c

#include

extern int a;

int main(void)

   {

      printf("%d\",a);

        return 0;

   }

実行結果は1
ただしfile 1.cではint a=1をstatic int a=1に変更する.
ではfile 2.cは変数aにアクセスできません.なぜならstaticでグローバル変数を修飾してその役割ドメインの範囲を変更し、元のエンジニアリング全体の可視化からソースファイルの可視化に変更したからです.
 
3.オブジェクトのC++のstatic向け
C++のstaticには他の機能もあり、クラスの関数をC++でstaticで修飾すると、その関数はクラスに属し、このような特定のオブジェクトに属していないことを示します.クラス内の変数をstatic修飾すると、その変数がクラスおよびそのすべてのオブジェクトのすべてであることを示します.クラスとオブジェクトで呼び出すことができます.静的メンバー関数では、静的メンバー関数と静的メンバー変数のみにアクセスでき、非静的メンバー関数または変数にアクセスできません.
 
4.その他の関連結論:
1)クラス名でクラスの非静的メンバー関数を呼び出すことはできません
2)クラスのオブジェクトは、静的メンバー関数と非静的メンバー関数を使用できます.
3)静的メンバー関数では非静的メンバーは参照できません
4)クラスの非静的メンバーは静的メンバー関数を呼び出すことができ、逆にできない
5)クラスの静的メンバー変数は、初期化してから使用する必要があります.
 
externキーワード:
C言語では、修飾子externは、変数または関数の宣言の前に「この変数/関数は別の場所で定義されており、ここで参照する」ことを説明するために使用されます.
上記の例では、file 2でfile 1の変数aを呼び出すには、externで宣言するだけでaを呼び出すことができ、これがexternの役割であることがわかる.実は他のファイルの関数と変数を呼び出すには、そのファイルを#includeで含めるだけでいいのですが、なぜexternを使うのですか?externを使うとプログラムのコンパイルプロセスが加速するので、時間を節約できます.
C++においてexternは、CまたはC++関数の呼び出し仕様を示す別の役割を果たす.たとえばC++でCライブラリ関数を呼び出すには,C++プログラムでextern"C"で参照する関数を宣言する必要がある.これはリンクに使うもので、リンクにリンクするときにC関数仕様でリンクするように伝えます.主な理由は,C++とCプログラムのコンパイルが完了すると,ターゲットコードにネーミングルールが異なり,名前マッチングの問題を解決するためである.