zoukankan      html  css  js  c++  java
  • BUILD_BUG_ON 的解释

    知乎上个问题《C 语言有什么奇技淫巧?》排名第一的是一个“抖机灵”的答案。

    C有一个鲜为人知的运算符叫”趋向于”, 写作“-->”。比如说如果要实现一个倒数的程序,我们可以定义一个变量x,然后让它趋向与0:

    其它答案也是蛮有意思的,有个和解答与它一样,可以看做"!!" 符号。

    /* Force a compilation error if condition is true */
    #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))

     但它的确是两个!的叠加,有如下例子为证

    #include <stdio.h>
    #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
    int main()
    {
       BUILD_BUG_ON(0!=0);
       bool zero = false;
       printf("%d
    ", !!zero);
       printf("%d
    ", !zero);
       return 0;
    }

     该结果输出 0 1

    所以!符号的作用是将条件语句的bool值,转化为0 和1。

    如果添加为真,则编译时报错

    error: size of array is negative

    但是这个编译时检查是有条件的,如果你写上

    BUILD_BUG_ON(zero)

    编译器无论如何也是无法检查的,因为变量的值是运行时。

    在网上搜索了下,还有用用位域来强制编译器检查的,也是可以做借鉴的。

    #define BUILD_BUG_ON_ZERO(e)  (sizeof(struct{int : -!!(e);}))
    #define BUILD_BUG_ON_NULL(e)  ((void*)sizeof(struct{int : -!!(e);}))
    
    #define BUILD_BUG_ON(condition)  ((void)BUILD_BUG_ON_ZERO(condition))
    
    #define MAYBE_BUILD_BUG_ON(condition)  ((void)sizeof(char[1 - 2 * !!(condition)]))
  • 相关阅读:
    【Rust】无关联类型
    【Rust】trait克隆
    【Rust】trait动态返回
    【Rust】trait迭代器
    【Rust】特质trait
    【Rust】运算符重载
    【Rust】trait超集
    【Rust】trait删除
    【Rust】trait实现
    wpf之数据模板 安静点
  • 原文地址:https://www.cnblogs.com/westfly/p/4210231.html
Copyright © 2011-2022 走看看