ページ 11

プロトタイプ宣言の必須化

Posted: 2010年10月10日(日) 08:57
by みけCAT
おはようございます。みけCATです。
開発環境はDev-c++4.9.9.2(コンパイラはデフォルト)
もしくはTeraPad0.93とMinGWと自作ソフトを使っています。
たとえばこのコードを見てください。
#include <stdio.h>

int main(void) {
    printf("%d\n",zikkenn(3,5));/*スペルミス*/
    return 0;
}

int zikken(int a,int b) {
    return a+b;
}
このコードをコンパイルすると、
[Linker erro[/url] undefined reference to `zikkenn'
というエラーが出ます。
この程度のプログラムであれば、zikkennというトークンがどこに使われているかわかりやすいですが、
もっと大きいプログラムになるとわかりにくくなります。
検索すればいいかもしれないですが、
#include <stdio.h>

int main(void) {
    printf("%d\n",ikken(3,5));/*スペルミス*/
    return 0;
}

int zikken(int a,int b) {
    return a+b;
}
のようなパターンになると、ikkenで検索するとzikkenも引っかかってきて、検索しにくいと思います。
そこで、関数のプロトタイプ宣言を必須にして、プロトタイプ宣言がない関数を使用すると
そこで警告かエラーを吐くようにするコマンドラインオプションはありますでしょうか?
教えていただければ幸いです。

Re:プロトタイプ宣言の必須化

Posted: 2010年10月10日(日) 10:52
by たかぎ
一番手っ取り早いのはC++でコンパイルすることです。

Re:プロトタイプ宣言の必須化

Posted: 2010年10月10日(日) 13:09
by へろりくしょん
grepあたりで検索するという手もありますね。

Re:プロトタイプ宣言の必須化

Posted: 2010年10月10日(日) 13:19
by たかぎ
一応GCCのオプションについても回答しておきます。

-Wimplicit-function-declaration
-Werror-implicit-function-declaration

この二つがそれに該当するはずです。

Re:プロトタイプ宣言の必須化

Posted: 2010年10月10日(日) 13:26
by みけCAT
たかぎさん
ありがとうございます。
#include <stdio.h>

int main(void) {
    printf("%d\n",zikken(3,5));/*スペルミス*/
    return 0;
}

int zikkenn(int a,int b) {
    return a+b;
}
を-Wimplicit-function-declarationオプションでコンパイルすると

F:\C\error\error2.c: In function `main':
F:\C\error\error2.c:4: warning: implicit declaration of function `zikken'

C:\Users\(ユーザー名)\AppData\Local\Temp/ccWAbaaa.o(.text+0x3a):error2.c: undefined reference to `zikken'
collect2: ld returned 1 exit status

と表示されました。

エディタで検索するときに「単語全部が一致」を使うという手もあります。