FC2ブログ

プロトタイプ宣言の無い関数呼び出し

HP-UXの64bitコンパイラで、久々にCをいぢってて泣いたケースを。

C言語は関数宣言に関してアバウトなので、例えば、

#include < stdio.h >
int main(void) {
        printf("%s\n", foo());
        return 0;
}

なんていうように、foo()のプロトタイプ宣言がなくてもコンパイラはエラーを吐かない。
実装がconst char *foo(void)であっても暗黙に、引数なしでintを返す関数:int foo(void)と解釈される。(*1)

これが32bitコンパイラであれば、intとchar *のサイズはいずれも4バイトで、実行してもなんら問題はないわけなんだが、64bitコンパイラでは勝手が違う。

HP-UXのaCCでは、intは4Byteだが、ポインタ変数は8Byteなので、実行時にコケる。
Cのいい加減さに慣れてしまっていると、なかなか気がつかないのが曲者。

きちんとプロトタイプ宣言する(あるいはプロト宣言したヘッダをきちんとincludeする)ことで正常に動作するのだが、あれこれ悩む人が多い。

まぁワーニングレベルを最大にしておけば「プロトタイプ宣言が無い」くらいは出してくれるんだけど、なんか面倒臭がる向きが多くてね。


(*1) ###2006/11/19 追記
C99では未定義とされている。
スポンサーサイト



コメントの投稿

非公開コメント

プロフィール

f_yamaki

Author:f_yamaki

アクセスカウンタ
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

この人とブロともになる

ブログ内検索
RSSフィード
リンク