免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 11416 | 回复: 28
打印 上一主题 下一主题

((void)sizeof(char[1-2*!!(condition)])) 它的意思是什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-28 12:42 |只看该作者 |倒序浏览
本帖最后由 wangzhen11aaa 于 2011-10-28 13:03 编辑

38         BUILD_BUG_ON(sizeof boot_params != 4096);

34 #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
这个意思是什么,最后这个(void)是干什么的。
最后得到void,这个用途是什么?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2011-10-28 13:05 |只看该作者
防止编译器给出警告的吧,不懂,瞎扯

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2011-10-28 13:12 |只看该作者
这应该是个编译时"反"断言。

1 - 2*!!(condition)的意思是若条件为真,表达式值为-1,否则为1 —— (condition)? -1: 1
而-1作为数组维度是不合法的,编译时会产生错误。
void 可能是为了避免空语句警告吧……


其实相比:
1. char a[(condtion)? 1: -1];
(void)a;
2. (void)sizeof(char[(condition)? 1: -1])
3.  typedef int xxx[(condition)? 1: -1]  最给力, 无论是从出错消息,还是从警告方面来说……

论坛徽章:
0
4 [报告]
发表于 2011-10-28 13:19 |只看该作者
回复 3# OwnWaterloo

1 /*Used to check the typedef int xxx[-1];
  2 *
  3 */
  4 #include<stdio.h>
  5 int main()
  6 {
  7         char a[-1];
  8         typedef int a[-1];
  9 }
gcc -o testtypedef testtypedef.c
testtypedef.c: In function ‘main’:
testtypedef.c:7: 错误:数组 ‘a’ 的大小为负
testtypedef.c:8: 错误:数组 ‘a’ 的大小为负
testtypedef.c:8: 错误:‘a’ 被重新声明为不同意义的符号
testtypedef.c:7: 错误:‘a’ 的上一个声明在此
果然如此。。。
但是typedef int xxx[];这个怎么想不通?难道是int 的另一个别名叫做 xxx[]?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2011-10-28 13:39 |只看该作者
回复 4# wangzhen11aaa

typedef int A[N]; 是给 int [N] (维度为N的int数组) 起一个别名叫A。


对比看看:

  1. typedef int A[N];
  2.         int a[n];
复制代码
所以前段时间有个帖, 说应该这样定义指针:
typeof(char*) p,q;

这样定义数组:
typeof(char[n]) a,b;


其他一些语言里数组是这样:
TYPE[DIM] x;

论坛徽章:
0
6 [报告]
发表于 2011-10-28 13:57 |只看该作者
回复 5# OwnWaterloo
原来如此,就是为整体做了一下封装给另一个变量名。谢谢。

论坛徽章:
0
7 [报告]
发表于 2012-05-20 19:30 |只看该作者
OwnWaterloo 发表于 2011-10-28 13:12
这应该是个编译时"反"断言。

1 - 2*!!(condition)的意思是若条件为真,表达式值为-1,否则为1 —— (con ...


前面说的对,这里void 的意思是将这个宏得到的值显示的丢弃,不能再使用。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
8 [报告]
发表于 2012-05-20 19:48 |只看该作者
回复 3# OwnWaterloo


    sizeof(char[1 - 2*!!(condition)]) will available to use "if statement" , that will lead to a jump instrument
so, i think sizeof(char[1 - 2*!!(condition)]) is more effective.

but i can't understand what (void) means

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
9 [报告]
发表于 2012-05-28 22:49 |只看该作者
folklore 发表于 2012-05-20 19:48
回复 3# OwnWaterloo

sizeof(char[1 - 2*!!(condition)]) will available to use "if statement" , that will lead to a jump instrument
so, i think sizeof(char[1 - 2*!!(condition)]) is more effective.

你的意思是无分支的 1-2*!!(condition) ,会比有分支的(condition)? -1: 1快?也许吧。
但这个表达式是在编译时求值的,肯定不会影响运行时效率。根本就是个空语句嘛……


folklore 发表于 2012-05-20 19:48
回复 3# OwnWaterloo

but i can't understand what (void) means
OwnWaterloo 发表于 2011-10-28 13:12
...
void 可能是为了避免空语句警告吧……
...
2. (void)sizeof(char[(condition)? 1: -1])
...

论坛徽章:
0
10 [报告]
发表于 2012-05-28 23:41 |只看该作者
本帖最后由 gtkmm 于 2012-05-28 23:41 编辑

void应该是防优化掉这一行。

如果没有那个void,可能被编译器优化。
这个在boost::asio里面有这样的用法和类似的注释说明。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP