FreeBSD の LLVM で C 言語の整数型リテラル値とマクロ定数の論理和を試す2018年09月24日 11時33分41秒

FreeBSfD の LLVM で C 言語の整数型リテラル値の論理和を試した所、警告が出たので、少し捻りを加えて実験することにした。

確かに直打ちの定数では暗算で簡単に出来るかも知れない。それなら、マクロではどうなるかと思ったのが発端だ。

freebsd% cat logical-and-macro-int.c
#define TWO 2
int main()
{   
    return 1 && TWO;
}
マクロを使って定数を書いてみた。このファイルでは上記されているが、業と読みづらくしたいのなら、読み込むヘッダファイルやコマンドラインからの変更も行える。
freebsd% cc logical-and-macro-int.c
logical-and-macro-int.c:4:14: warning: use of logical '&&' with constant operand
      [-Wconstant-logical-operad]
    return 1 && TWO;
             ^  ~~~
logical-and-macro-int.c:4:14: note: use '&' for a bitwise operation
    return 1 && TWO;
             ^~
             &
logical-and-macro-int.c:4:14: note: remove constant to silence this warning
    return 1 && TWO;
            ~^~~~~~
1 warning generated.
LLVM の C コンパイラは、マクロの定数の論理和も好まないようだ。それなら、マクロの値をコマンドラインから渡してやる。
freebsd% cat logical-and-secret-macro-int.c
int main()
{   
    return 1 && SECRET;
}
freebsd% cc logical-and-secret-macro-int.c
logical-and-secret-macro-int.c:3:17: error: use of undeclared identifier
      'SECRET'
    return 1 && SECRET;
                ^
1 error generated.
freebsd% cc -DSECRET=1 logical-and-secret-macro-int.c
freebsd% cc -DSECRET=0 logical-and-secret-macro-int.c
SECRET の値を定義しないともちろんエラーになるが、 LLVM は SECRET がマクロであることに不満はないようだ。

FreeBSD 11.2-RELEASE の LLVM 6.0.0 を利用。

前回次回