BLOGTIMES
2010/05/07

gccで暗黙の関数宣言をエラーとして扱う

  c 
このエントリーをはてなブックマークに追加

gccでは暗黙でstdio.hがincludeされているので下記のような、#include <stdio.h>が書かれていないプログラムでも(さすがに警告は出ますが)コンパイル自体は通ってしまいます。

test.c

int main(){ printf("Hello World!\n"); return 0; }

具体的には下記のような感じです。ある程度プログラムに慣れているプログラマーであれば、警告にもきちんと目を通すだろうし、その意味もちゃんと理解できるので、本来はこのあたりは取るに足らない挙動です。

$ gcc test.c -o test test.c: In function 'main': test.c:2: warning: incompatible implicit declaration of built-in function 'printf' $ ./test Hello World!

現在、研究プロジェクトで初学者向けのプログラミング学習支援をやっているのですが、やはり初学者は基本に忠実であることが必要であり、おまじないと言われてしまうことも多いincludeの意味を考えるという意味でも、暗黙の関数宣言に最初から頼るのはまずいだろうということになり、gccのこの挙動を無効化できないかということで、gccで暗黙の関数宣言をエラーとして扱う方法を調べてみました。

結論から言うと、gcc 4.1.2では-Werror-implicit-function-declarationというオプションをつけると暗黙の関数宣言をエラーとして扱うことができることがわかりました。

暗黙の関数宣言がエラーになる例

$ rm test $ gcc -Werror-implicit-function-declaration test.c -o test.out test.c: In function 'main': test.c:2: error: implicit declaration of function 'printf' test.c:2: warning: incompatible implicit declaration of built-in function 'printf' $ ./test -bash: ./test: No such file or directory

参考情報

gccのバージョンによって指定のしかたが違うようなので、バージョンに応じたドキュメント(GCC online documentation - GNU Project - Free Software Foundation (FSF))を参照する必要があります。今回は4.1.2だったので、下記の部分を参考にしました。

Warning Options - Using the GNU Compiler Collection (GCC)

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

Give a warning (or error) whenever a function is used before being declared. The form -Wno-error-implicit-function-declaration is not supported. This warning is enabled by -Wall (as a warning, not an error).

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3544
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン