用大括号括起来的struct是什么意思?

史蒂文

最近,我正在跟踪一些源代码。看到以下宏时,我卡住了。

#define tmp(x)                                          \
((void) ((struct {                                     \
     _Static_assert(sizeof(x) <= 16, "Err"); \
     int dum;                                        \
 }){1})

此宏用于检查x的大小是否小于16。

关于这个宏,我有两个问题。

首先,以下格式的struct的含义是什么,这个样式有关键字吗?

(struct {                       
     .......                                      
 }){1};

第二,为什么将assert放入struct中?为什么不只致电_Static_assertmain?

鲁斯兰

这种“用括号括起来的声明和初始化”被称为复合文字此语法功能最早出现在C99中。其基本语法为:

( type ) { initializer-list }

因此,如果忽略_Static_cast您在这里所拥有的就是(struct { int dum; }){1},它声明了一个未命名的结构,并使用包含的该结构创建了一个复合文字dum==1类型转换为void简单地丢弃该值,避免了可能的“未使用的值”警告。

第二,为什么将assert放入struct中?为什么不只致电_Static_assertmain?

如果您注意到,它会扩展为没有以分号结尾的内容;(我想如果缺少右括号)是您的复制粘贴错误。)因此,它可以用作子表达式,例如

#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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在箭头函数中将对象文字括起来的括号是什么意思?

在Swift中,如果将括号括起来,这是什么意思呢?“(细绳)”

双大括号在systemd脚本中是什么意思?

在Groovy中大括号语法是什么意思?

js文件参考末尾的大括号是什么意思?

Spring:URL中的大括号是什么意思

bash中的大括号是什么意思?

用clang中用大括号括起来的列表初始化的char数组中的尾随符号是什么?

为什么我的连接字符串用大括号括起来? python

为什么在此POST请求中,then()处理函数的参数用大括号括起来?

大括号括起来的JavaScript

用Vim将大括号括起来吗?

如果if语句正确,是否用大括号括起来?

大括号括起来的构造函数参数代表什么?

sqlplus shell脚本中大括号中的@(在符号处)是什么意思?

android的字符串资源文件中的大括号{}是什么意思?

用大括号括住$ this附近的变量名的含义是什么

用var声明struct是什么意思?

在TypeScript中,将类括在尖括号“ <>”中是什么意思?

在python中用方括号括起一个整数是什么意思?

为什么用大括号括起来的参数列表返回最后一个参数?

关于用括号括起来的声明类型是什么的问题

花括号是什么意思?

围绕流程的括号是什么意思?

JavaCC中的括号是什么意思?

这些花括号是什么意思?

括号中的变量是什么意思?

快速方括号是什么意思?

在Typescript中,两个大括号之间具有两种类型的类型注释是什么意思?