gcc -Wallオプション

入門書「独習 C」を読み終わったので、今度は「C言語 入門書の次に読む本」というのを読み始めた。
で、gcc に -Wall オプションがあるのを知った。-Wall オプションは、コンパイル時にいろいろな警告を出すオプションのあらかた(全部じゃない)をまとめて指定するオプションで、これをつけてコンパイルすることでかなり細かい警告を出してくれる。この本では -Wall オプションをつけてコンパイルすることを強く薦めている。

じゃ、早速やってみよう。ネタは先日の btreesort.c。

takatoh@nightschool $ gcc -Wall btreesort.c -o btreesort
btreesort.c: In function ‘main’:
btreesort.c:28:5: warning: implicit declaration of function ‘time’ [-Wimplicit-function-declaration]
     srand((unsigned)time(NULL));
     ^
btreesort.c:26:11: warning: unused variable ‘root’ [-Wunused-variable]
     Tree *root = NULL;
           ^

コンパイルは出来たけど、警告が2つ出た。1つ目の implicit declaration of function ‘time’ は time 関数の暗黙の宣言という警告で、time.h をインクルードしていないのが原因のようだ。gcc は宣言のない関数を見つけると、その返り値が int だと仮定してコンパイルするらしい。とにかく、これは time.h をインクルードして解決。
2つ目の unused variable ‘root’ は使ってない変数があるってことだろう。これはこの変数の宣言を消せばOK。
次のように修正した。

takatoh@nightschool $ git diff
diff --git a/sandbox/btreesort.c b/sandbox/btreesort.c
index a96a16d..08da355 100644
--- a/sandbox/btreesort.c
+++ b/sandbox/btreesort.c
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <time.h>
 
 
 #define MAX 10
@@ -23,7 +24,6 @@ int main(void)
 {
     int i;
     int ary[MAX];
-    Tree *root = NULL;
 
     srand((unsigned)time(NULL));
 

もう一度コンパイルしてみよう。

takatoh@nightschool $ gcc -Wall btreesort.c -o btreesort
takatoh@nightschool $ ./btreesort
unsorted: 55 57 58 63 86 24 12 74 84 29 
sorted:   12 24 29 55 57 58 63 74 84 86

今度は何も警告なしにコンパイルできた。

[amazonjs asin=”4774146129″ locale=”JP” title=”C言語 入門書の次に読む本 改訂新版 (プログラミングの教科書)”]