设为首页 加入收藏

TOP

很酷的C语言技巧(二)
2014-11-24 00:40:15 来源: 作者: 【 】 浏览:71
Tags:语言 技巧
sizeof(struct { int:-!(condition); }) )
#define STATIC_NULL_ASSERT(condition) ((void *)STATIC_ZERO_ASSERT(condition) )

/* Force a compilation error if condition is false */
#define STATIC_ASSERT(condition) ((void)STATIC_ZERO_ASSERT(condition))
如果(condition)计算结果为一个非零值(即C中的真值),即! (condition)为零值,那么代码将能顺利地编译,并生成一个大小为零的结构体。如果(condition)结果为0(在C真为假),那么在试图生成一个负大小的结构体时,就会产生编译错误。

它的使用非常简单,如果任何某假设条件能够静态地检查,那么它就可以在编译时断言。例如,在上面提到的标志列表中,标志集合的类型为uint32_t,所以,我们可以做以下断言:


STATIC_ASSERT(Total <= 32)
它扩展为:


(void)sizeof(struct{int:-!(Total <= 32) })
现在,假设Total<=32。那么-!(Total <= 32)等于0,所以这行代码相当于:


(void)sizeof(struct{int: 0 })
这是一个合法的C代码。现在假设标志不止32个,那么-!(Total <= 32)等于-1,所以这时代码就相当于:


(void)sizeof(struct{int: -1 } )
因为位宽为负,所以可以确定,如果标志的数量超过了我们指派的空间,那么编译将会失败。


摘自 Michael Xiao的程序人生
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c语言中不使用操作符实现两个数相.. 下一篇Emacs自动填充头文件

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: