GCC の警告オプションで一部の警告のみをエラー扱いにしたい
GCC の警告オプションでよく使うものといえば、以下のようなものがある:
- -Wall 一般的な警告を有効にする
- -Wextra (-W) -W が gcc 4 から分かりやすい名前に変更された(-W も有効)
- -Werror 警告をエラー扱いにする
-Wunused-parameter
ところで、警告オプションのひとつ、-Wunused は -Wextra (-W) が有効な場合、-Wunused-parameter も有効にする。-Wunused-parameter は関数で使われていない引数があった場合に警告を出力するオプションだ。なお、-Wunused は -Wall によっても暗黙的に指定されるため、-Wextra (-W) と -Wall を両方指定したときも、-Wunused-parameter が有効になる。
このとき、もし、-Werror も有効になっていると、未使用の関数引数があった場合にコンパイルエラーになってしまう。意図した通りの動作ではあるものの、これでは都合が悪いときもある。たとえば、テスト駆動開発では関数の実装を空にしておくことがあるが、上記の場合は、これがエラーとなってしまう。
-Wno-unused-parameter
Mac OS X Leopard (Xcode 3.1) に付属する gcc は Apple gcc 4.0 と 4.2 だが、デフォルトは gcc 4.0 が使われる。
% gcc --version
i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5490)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
gcc 4.0 の場合、-Wno-unused-parameter を指定することで「未使用の関数引数」警告自体をなくすことはできる。しかし、できれば、「未使用の関数引数」も警告のまま残し、他の警告はエラー扱いにしたい。
% gcc -std=c++98 -pedantic -Wall -Wextra -Werror -Wno-unused-parameter -c -o src/utils.o src/utils.cpp
-Werror=, -Wno-error=
オンラインマニュアルによると、gcc 4.2 からは -Werror= および -Wno-error= というオプションが追加され、エラー扱いにする警告を個別に指定できるようだ。このオプションを使えば、-Wunused-parameter は警告のまま、その他の警告をエラーに出来るだろう。Mac OS X では gcc 4.2 は gcc-4.2 という名前でインストールされている。
% gcc-4.2 -std=c++98 -pedantic -Wall -Wextra -Werror -Wno-error=unused-parameter -c -o src/utils.o src/utils.cpp
src/utils.cpp:108: warning: unused parameter 'start'
src/utils.cpp:108: warning: unused parameter 'end'
src/utils.cpp:108: warning: unused parameter 'positiveOnly'
しかし、Mac の場合、gcc 4.0 がデフォルトなので、このオプションを使っていいのか悩むところ。
環境変数の利用
いまのところ、Makefile には直接書かずに、環境変数で指定する、という方法で対応している:
% CXX=gcc-4.2 CPPFLAGS=-Wno-error=unused-parameter make