個人メモ--externとstatic区分


externキーワード宣言変数または関数は外部変数または関数です.変数または関数体が外部ファイルで定義されていることを示します.コンパイラは、この宣言に遭遇すると、他のモジュールに変更関数体または変数を探します.
staticは変数または関数が静的であることを明らかにした.静的な関数または変数は、この変数または関数を本ファイルにのみ適用します.一般的に言えば、このファイルの内部でしか使用できません.他のファイルは同じものを定義しても私には関係ありません.コンパイラは間違いを報告しません.これもそのメリットです.初期化されていない静的変数の初期値は0です.静的変数はすべてグローバルデータ領域に格納されます.静的グローバル変数、静的ローカル変数を含む.
メモリ内の分散は次のとおりです.
コード領域//low address
グローバルデータ領域
スタックゾーン
スタック//high address
一般プログラムは新しく生成したダイナミックデータを
ヒープ領域に格納された自動変数
スタック領域に格納されます.自動変数は一般的に関数の終了に伴って空間を解放し、静的データ(関数内部の静的ローカル変数でも)はグローバルデータ領域に格納されます.グローバルデータ領域のデータは、関数の終了によって空間を解放するわけではありません.静的ローカル変数には、グローバルデータ領域にメモリを割り当てる機能があります.静的ローカル変数は、プログラムがオブジェクトの宣言を実行するときに最初に初期化され、すなわち、以降の関数呼び出しが初期化されなくなる.静的ローカル変数は一般的に宣言で初期化され、明示的な初期化がなければプログラムによって自動的に0に初期化されます.静的関数:
関数の戻りタイプにstaticキーを付けると、関数は静的関数として定義されます.静的関数は通常の関数とは異なり、宣言されたファイルでのみ表示され、他のファイルでは使用できません.   
非静的データ・メンバーの場合、各クラス・オブジェクトには独自のコピーがあります.静的データ・メンバーはクラスのメンバーとして扱われます.このクラスのオブジェクトが何個定義されているかにかかわらず、静的データ・メンバーはプログラム内でコピーが1部しかなく、このタイプのすべてのオブジェクトが共有してアクセスします.すなわち、静的データメンバーは、クラスのすべてのオブジェクトに共通しています.このクラスの複数のオブジェクトでは、静的データ・メンバーにはメモリが1回しか割り当てられず、すべてのオブジェクトが共有されます.したがって、静的データ・メンバーの値は各オブジェクトに対して同じであり、その値は更新できます.静的クラスデータメンバーは、クラスがオブジェクトをインスタンス化していない場合でも、グローバル領域に割り当てられます.静的メンバー間で相互にアクセスできます.静的メンバー関数から静的データメンバーへのアクセスと静的メンバー関数へのアクセスが含まれます.非静的メンバー関数は、静的メンバー関数および静的データメンバーに任意にアクセスできます.静的メンバー関数は、非静的メンバー関数および非静的データメンバーにアクセスできません.
eg:1.cppでchar aを定義する.2.にいたいならcppで使用する場合、2、cppで使用する場合、extern char aを使用します.char aを定義する場合[5].配列を定義します.2.cppでこの数字を使用するには、extern char a[]をこのように宣言する必要があります.申明がextern char*aであれば;エラーが発生します.理由はextern char*aです.コンパイラに文字列を指す外部ポインタがあることだけを伝えます.宣言は複数回使用でき、複数のファイルで使用できます.int aは、extern int aと、1つは変数を定義し、1つは変数を明らかにし、おじいさんのものです.細部ですね.全部大学の先生に任せました.汗はファイルに関数を定義し、外部externとして宣言します.
eg: 1.cppでは、次の関数を定義します.
#include "stdafx.h"
#include"iostream"
using namespace std;
//extern static my aa;
//extern static my bb;  //     static     ;
extern  my aa;   //  2.cpp        
extern  my bb;   //
void fun()
{
 cout<<"test static aa:"<<aa.a<<endl;
 cout<<"test static aa:"<<aa.b<<endl;
 cout<<"test static aa:"<<bb.a<<endl;
 cout<<"test static aa:"<<bb.a<<endl;
}
2.cppで定義されています
#pragma once
#include "stdafx.h"
#include"iostream"
using namespace std;
my aa,bb;  //              。 stdafx,h 
//static my aa,bb; //      , ,fun()          0,   2.cpp     ;
extern int temp1;
extern void fun();
int _tmain(int argc, _TCHAR* argv[])
{
  bb.a =1;
 bb.b =1;
 aa.a =0;
 aa.b=0;
 cout<<aa.a <<" "<<aa.b <<endl;
 cout<<bb.a <<" "<<bb.b <<endl;
 cout<<temp1<<endl;
 fun();
 system("pause");  
 return 0;
}
出力された結果は人の望み通りだ.