[216] Re:C言語ポインタ完全制覇についての質問
投稿者:れぷ
2007/02/20 02:13:25
九龍さん、はじめまして。
3つに別けたのはa.cのコードが以下のような状況を想定しているように思えたからです。
---a.c---
void hoge1(void) {
extern void piyo(int a); // b.c内を想定
piyo(1);
}
void hoge2(void) {
piyo(2); // c.cを想定
}
なので、↓こういう状況を考えたわけです。
---b.c---
// hoge1()ではAさんがくれたこっちを使おうと思った
void piyo(int a) {
return;
}
---c.c---
// hoge2()ではBさんがくれたこっちを使おうと思った
int piyo(int a) {
return a;
}
この状態でb.c内にあるpiyo()をhoge1()ローカルだけに対して定義できるかというとできないですよね。
従って、hoge1()でローカルexternしたpiyo()はどこにあるのかというと、
コンパイラは「外部にある関数はグローバルに存在すると想定する」としかないのかな、と思います。
そうなると、
「hoge1()でローカルexternされてるpiyo()はグローバルにあるはず」
「hoge2()のpiyo()はプロトタイプ宣言ないけどこれも多分グローバルにあるはず」
になるので、a.cのコンパイル時に正しいpiyo()をリンクするための情報を作るには
「正しいpiyo()はどれですか?」と整合エラーを吐くしかないような気がしました。
名前空間があれば解決できるのでしょうが、Cは空間分けがザックリすぎて(^-^;)
それができないですよね。