質問: ": - !!"とは何ですかcコードで? 私は / usr/include/linux/kernel.h でこの奇妙なマクロコードにぶつかった。/* force a compilation error if condition is true, but also produce a result (of value 0 and type size_t), so the expression can be used e.g. in a structure initializer (or where-ever else comma expressions aren't permitted). */ #define build_bug_on_zero(e) (sizeof(struct { int:-!!(e); })) #define build_bug_on_null(e) ((void *)sizeof(struct { int:-!!(e); })) :-!!は何をしますか?
回答: :はビットフィールドです。 !!については、 論理二重否定 であるため、falseの場合は0、trueの場合は1を返します。そして-はマイナス記号、すなわち算術否定です。無効な入力をコンパイラに認識させるのは、単なるトリックです。build_bug_on_zeroを考えます。 -!!(e)が負の値に評価されると、コンパイルエラーが発生します。それ以外の場合、-!!(e)は0と評価され、0幅のビットフィールドのサイズは0になります。したがって、マクロは0の値を持つsize_tとして評価されます。入力がnotzeroである場合、実際にはビルドが失敗するため、この名前は私の考えでは弱くなっています。build_bug_on_nullはよく似ていますが、intではなくポインタを生成します。