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でその関数が使える。
基本こんな感じかな?
ただテキスト見てると
「外部リンケージのグローバル変数」とか
「外部リンケージの関数」とかって言っててサァ、
なんか「内部リンケージの関数」とかもありますよ〜って暗に言ってるようにも取れるのがきになる。
これもまだ勉強途中だから、とりあえず今の勉強範囲ではリンケージはここまで。