C++ ⇒ VBA 書いて覚えるための初心者自己中記事

C++ ⇒ VBA 勉強の履歴を付けるというかノート代わりに使ってます

C++ 外部・内部リンケージについて[extern] [static] 書いて覚えるための初心者自己中記事

ソースファイルが複数ある場合の情報の共有関係のことをリンケージという

 

まず勘違いしていたのはリンケージ#includeされているファイルかどうかとか関係ないということ。

 

では、

まずファイルを超えて利用可能なものを外部リンケージ

ファイルを超えられない、外部では利用不可なものを内部リンケージという。

 

まずグローバル変数外部リンケージ

ただし、別のファイルで利用したい場合は別ファイル側で「 extern 変数宣言」をしなければならない。

どういうことかというと

 

 

---------------------------------------------

ソースファイルA

 

int a = 100; //グローバル変数

--------------------

ソースファイルB

int main(){

    extern int a;

    cout << a << endl;

}

(結果)

100

---------------------------------------------

こんな感じ。

ソースファイルAでは関数の外変数宣言をしているのでグローバル変数になる。

このグローバル変数ソースファイルBでも使いたい場合は使いたい側のファイル内でextern int a; とすると利用可能になるということ。

extern つけないと普通にローカル変数ができるだけだよ。

 

そして外部リンケージstatic をつけるとなんと内部リンケージ変えることができる。

この場合はグローバル変数static をつけるってことね。

---------------------------------------------

ソースファイルA

 

static int a = 100; //ここで内部リンケージにした

--------------------

ソースファイルB

int main(){

    extern int a; //外部リンケージとしてのint型の変数aはもういないからエラーになる

    cout << a << endl;

}

(結果)

エラー

---------------------------------------------

うん、ソースファイルBでは使えなくなっている。

ってか、static って静的ローカル変数にするためのじゃなかったの?

・・・

google先生に聞いても教えてくれないから深く追求できない。

勉強進めたらいずれわかるかな?

 

とりあえず static つけたら内部リンケージになると覚えよう。

 

次に関数リンケージについて。

関数の場合は関数プロトタイプを書くと使える。

---------------------------------------------

ソースファイルA

 

void Test(int i){

    for(int x = 0 ; x < i ; ++x){

        cout << x << " " << flush;

    }

    cout << endl;

}

--------------------

ソースファイルB

void Test(int i);

 

int main(){

    int i = 10;

    Test(i);

}

 

(結果)

0 1 2 3 4 5 6 7 8 9

---------------------------------------------

ソースファイルA関数実装する。

ソースファイルB関数プロトタイプを書くとソースファイルBでその関数が使える

 

 

基本こんな感じかな?

ただテキスト見てると

「外部リンケージのグローバル変数」とか

「外部リンケージの関数」とかって言っててサァ、

なんか「内部リンケージの関数」とかもありますよ〜って暗に言ってるようにも取れるのがきになる。

 

これもまだ勉強途中だから、とりあえず今の勉強範囲ではリンケージはここまで。