K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>>分割コンパイルなどで、外部で定義している変数を参照するには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をつける必要はない、というのが私の理解です。
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!