最近,我正在跟踪一些源代码。看到以下宏时,我卡住了。
#define tmp(x) \
((void) ((struct { \
_Static_assert(sizeof(x) <= 16, "Err"); \
int dum; \
}){1})
此宏用于检查x的大小是否小于16。
关于这个宏,我有两个问题。
首先,以下格式的struct的含义是什么,这个样式有关键字吗?
(struct {
.......
}){1};
第二,为什么将assert放入struct中?为什么不只致电_Static_assert
main?
这种“用括号括起来的声明和初始化”被称为复合文字。此语法功能最早出现在C99中。其基本语法为:
( type ) { initializer-list }
因此,如果忽略_Static_cast
,您在这里所拥有的就是(struct { int dum; }){1}
,它声明了一个未命名的结构,并使用包含的该结构创建了一个复合文字dum==1
。类型转换为void
简单地丢弃该值,避免了可能的“未使用的值”警告。
第二,为什么将assert放入struct中?为什么不只致电
_Static_assert
main?
如果您注意到,它会扩展为没有以分号结尾的内容;
。(我想如果缺少右括号)
是您的复制粘贴错误。)因此,它可以用作子表达式,例如
#define tmp(x) \
((void) ((struct { \
_Static_assert(sizeof(x) <= 16, "Err"); \
int dum; \
}){1}))
#include <stdio.h>
int main()
{
const int x=324;
const double y=(tmp(x), 23.342);
printf("%g\n", y);
}
不知道为什么要这样做,但是至少在某些情况下需要此宏时,该宏的作者才能使用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句