[1021] Re:externについて
投稿者:(ぱ)こと管理人
2007/08/20 22:51:43
>分割コンパイルなどで、外部で定義している変数を参照するにはexternを使う、と
>よく本に書いてあると思いますが、外部の関数を参照するにはexternを
>付ける必要がないように見受けられるのです。これはなぜなんでしょうか。
774RRさんのおっしゃるようにそういう約束だから…なのですが(X3010の6.1.2.2)それを言ってしまうとつまらないので、理由を考えますと。
大規模なプログラムを何人もの人で書いている場合、グローバル変数の名前が偶然かち合ってしまう可能性があります。たとえば
a.c:
int hoge;
b.c:
int hoge;
と書いてもエラーにならないと困ってしまいます。この場合、それぞれの担当プログラマには、「グローバル変数の値がいつの間にか変わっている」という得体の知れないバグとして見えるはずです。
その点、「externなしで定義できるのは必ず1箇所のみ、それ以外の箇所では必ずexternを書け」という規則にしておけば、リンク時にエラーになるのでこの問題を回避することができます。
では関数の場合はどうかというと、関数名が偶然かち合ったとして、
a.c:
int hoge(void) {...}
b.c:
int hoge(void) {...}
とか書いたらどうせエラーです。
つまり、関数の場合、関数の処理を書くブロックの有無で定義と宣言の区別がつくため、わざわざexternをつける必要はない、というのが私の理解です。