What is “:-!!” in C code?

发布时间:2016-12-31 7:39:51编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"What is “:-!!” in C code? ",主要涉及到What is “:-!!” in C code? 方面的内容,对于What is “:-!!” in C code? 感兴趣的同学可以参考一下。

  1. stackoverflow上看到的这个问题,觉得挺有趣,顺手记下来。


    I bumped into this strange macro code in /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); }))

    This is, in effect, a way to check whether the expression e can be evaluated to be 0, and if not, to fail the build.



    You should read the expression like this:

    sizeof(struct { int: -!!(e); }))
    1. (e): Compute expression e.

    2. !!(e): Logically negate twice: 0 if e == 0; otherwise 1.

    3. -!!(e): Numerically negate the expression from step 2: 0 if it was 0; otherwise -1.

    4. struct{int: -!!(0);} --> struct{int: 0;}: If it was zero, then we declare a struct with an anonymous integer bitfield that has width zero. Everything is fine and we proceed as normal.

    5. struct{int: -!!(1);} --> struct{int: -1;}: On the other hand, if it isn't zero, then it will be some negative number. Declaring any bitfield with negative width is a compilation error.

    So we'll either wind up with a bitfield that has width 0 in a struct, which is fine, or a bitfield with negative width, which is a compilation error. Then we take sizeof that field, so we get a size_twith the appropriate width (which will be zero in the case where e is zero).

上一篇:在CentOS 7 中 安装 VSFTP