clang でマクロの再定義を警告するには、-Wmacro-redefined
オプションを指定します。
#define MY_DEFINE 111
#define MY_DEFINE 222
int main(void)
{
return 0;
}
$ # M1 Mac (Ventura) + Apple clang 14.0.0
$ clang sample.cpp -Wmacro-redefined
sample.cpp:2:9: warning: 'MY_DEFINE' macro redefined [-Wmacro-redefined]
#define MY_DEFINE 222
^
sample.cpp:1:9: note: previous definition is here
#define MY_DEFINE 111
^
1 warning generated.
-Wmacro-redefined
は デフォルトで有効になっている ため、警告は自動的に表示されます。
$ # M1 Mac (Ventura) + Apple clang 14.0.0
$ clang sample.cpp
sample.cpp:2:9: warning: 'MY_DEFINE' macro redefined [-Wmacro-redefined]
#define MY_DEFINE 222
^
sample.cpp:1:9: note: previous definition is here
#define MY_DEFINE 111
^
1 warning generated.
警告を抑制する
逆に、警告を抑制したい場合は -Wno-macro-redefined
を指定します。
$ # M1 Mac (Ventura) + Apple clang 14.0.0
$ clang sample.cpp -Wno-macro-redefined
$
gcc のオプション
-Wmacro-redefined
は gcc でも使うことができます。 macOS では gcc
は clang のエイリアスのため、gcc-N
(N は gcc のバージョン)を使う必要があります。
$ # M1 Mac (Ventura) + gcc 12.2.0
$ gcc-12 sample.cpp
$sample.cpp:2: warning: "MY_DEFINE" redefined
2 | #define MY_DEFINE 222
|
sample.cpp:1: note: this is the location of the previous definition
1 | #define MY_DEFINE 111
|
参考資料
- Clang documentation — DIAGNOSTIC FLAGS IN CLANG
https://clang.llvm.org/docs/DiagnosticsReference.html#wmacro-redefined