关于使用sizeof和不使用sizeof

qq_40162781 2019-04-07 07:52:41
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
这段如果不使用sizeof会有什么情况,是不是如果e的值为0不使用sizeof就会声明出来一个匿名结构?使用sizeof就不会
...全文
277 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlbertS 2019-04-08
  • 打赏
  • 举报
回复
这段代码作用是什么呢?只要调用这个宏,结果就会存在吧,编译的时候后就确定了的,使用不使用sizeof只是改变了宏的含义,结构不会被优化掉吧,期待大神回答
  • 打赏
  • 举报
回复
1、这个宏的作用5楼已经讲解清楚 2、c++只是部分兼容c,在c得到的结果在c++不一致很正常,具体原因可能和编译器有关 3、如果不使用sizeof,确实会声明一个匿名结构体
636f6c696e 2019-04-08
  • 打赏
  • 举报
回复
不只是声明哦,你要考虑具体调用这个宏的地方,都会创建一个真实的结构体,占用栈空间。
AlbertS 2019-04-08
  • 打赏
  • 举报
回复
引用 9 楼 qq_40162781 的回复:
[quote=引用 8 楼 AlbertS 的回复:]
[quote=引用 6 楼 lin5161678 的回复:]
先别管

[quote=引用 4 楼 AlbertS 的回复:]
这是什么语法呢?我都编译不过去

BUILD_BUG_ON_ZERO(0) 可以编译
不是0 就不能编译
[/quote]
是0没有编译成功,提示“不允许使用类型定义”[/quote]
对哦,,c语言可以c++不行。。。。。有大神知道什么原因吗[/quote]
测了一下,确实是这样,C语言可以编译通过,C++不行,另外对于位域内变量为0的情况,C++使用sizeof得到的值是1,而C语言是0,等待大神解惑
qq_40162781 2019-04-08
  • 打赏
  • 举报
回复
引用 8 楼 AlbertS 的回复:
[quote=引用 6 楼 lin5161678 的回复:] 先别管 [quote=引用 4 楼 AlbertS 的回复:] 这是什么语法呢?我都编译不过去
BUILD_BUG_ON_ZERO(0) 可以编译 不是0 就不能编译 [/quote] 是0没有编译成功,提示“不允许使用类型定义”[/quote] 对哦,,c语言可以c++不行。。。。。有大神知道什么原因吗
AlbertS 2019-04-08
  • 打赏
  • 举报
回复
引用 6 楼 lin5161678 的回复:
先别管

[quote=引用 4 楼 AlbertS 的回复:]
这是什么语法呢?我都编译不过去

BUILD_BUG_ON_ZERO(0) 可以编译
不是0 就不能编译
[/quote]
是0没有编译成功,提示“不允许使用类型定义”
AlbertS 2019-04-08
  • 打赏
  • 举报
回复
引用 5 楼 636f6c696e 的回复:
这个是内核的一种写法,主要用于编译期间就发现这些潜在的致命错误。
!!(e)表示两次取反e,e非0结果为1,e为0结果为0。
struct{int:xx}是一个匿名结构体,冒号表示位域,如果e非0等价于struct{int:-1},位域不为负数,非法,编译报错。
用sizeof主要是隐藏匿名结构体的声明,且不会在运行过程中产生额外的内存损耗。

你说的这些细节我可以理解,但是我确实编译不过去,BUILD_BUG_ON_ZERO这个宏定义米问题,但是BUILD_BUG_ON_ZERO(0) 编译错误,测试环境VS2015
lin5161678 2019-04-08
  • 打赏
  • 举报
回复
先别管
引用 4 楼 AlbertS 的回复:
这是什么语法呢?我都编译不过去
BUILD_BUG_ON_ZERO(0) 可以编译 不是0 就不能编译
636f6c696e 2019-04-08
  • 打赏
  • 举报
回复
这个是内核的一种写法,主要用于编译期间就发现这些潜在的致命错误。 !!(e)表示两次取反e,e非0结果为1,e为0结果为0。 struct{int:xx}是一个匿名结构体,冒号表示位域,如果e非0等价于struct{int:-1},位域不为负数,非法,编译报错。 用sizeof主要是隐藏匿名结构体的声明,且不会在运行过程中产生额外的内存损耗。
AlbertS 2019-04-08
  • 打赏
  • 举报
回复
这是什么语法呢?我都编译不过去
coo135 2019-04-08
  • 打赏
  • 举报
回复
sizeof() 是运算符,不是函数~~不会产生匿名结构~

当e不为0时,编译出错,e为0时,sizeof(struct { int:-!!(e); } ; sizeof计算结果为0,整句就被替换成 0; 然后编译器就把它忽略了。

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧