[204] Re:C言語ポインタ完全制覇についての質問
投稿者:(ぱ)
2007/02/20 02:13:25
> どうせ仮引数でdoubleしか渡せないのなら、void sub_funcの関数宣言での
>floatへのポインタの仮引数宣言は、doubleへのポインタに読み替えられて
>いるのではないかという勝手な勘違いです。
それをやっちゃうと、swap(float *a, float *b)のような関数で困りますし。
> 例えば、別のモジュールで定義宣言されている関数を、他のモジュールの
>関数ブロック内でextern void f (void)とすると(普通はこんなことしませんが)、
>その関数ブロック内だけでその関数への参照が可能だと思っていたのですが、
>それより下の関数定義ブロック内でも参照可能となっていました(VC++ 6.0で確認)。
もともと、プロトタイプ宣言なんて書かなくても(警告は出ても)動きますから、
結合はされるとしても、プロトタイプ宣言の有効範囲は微妙な問題のように
思います。
以下のソースをbcc32でコンパイルしたところ、
void hoge1(void)
{
extern void piyo(int a);
piyo(1);
}
void hoge2(void)
{
piyo(2);
}
こんなエラーが出ました。
エラー E2356 proto2.c 10: 'piyo' の再宣言で型が一致していない(関数 hoge2 )
エラー E2344 proto2.c 3: 一つ前の 'piyo' の定義位置(関数 hoge2 )
hoge2のブロックの先頭に「extern void piyo(int a);」を入れると
ちゃんと通るので、少なくともbcc32においては、hoge1()内部の宣言がそのまま
hoge2()内部で有効になっているというわけではないようです。
この件について規格書になにか書いてないかとぱらぱらめくったのですが
見つけられませんでした。
ご存知の方がいらっしゃいましたら情報よろしくお願いいたします(_o_)