c - C中的圆括号和花括号代码块
问题描述
谁能解释这个宏的计算结果:
#define memcpy(dest,src,n) ({ \
void * _res = dest; \
__asm__ ("cld;rep;movsb" \
::"D" ((long)(_res)),"S" ((long)(src)),"c" ((long) (n)) \
:"di","si","cx"); \
_res; \
})
这是取自 Linux 内核的第一个版本,但我想知道由它包围的代码块({ })
代表什么以及它将在哪里使用?
解决方案
括号中的复合语句是 GCC 扩展,称为语句表达式。它允许您在需要表达式的地方包含声明、for 循环等。复合语句中的最后一件事应该是一个表达式,后跟一个分号,作为整个构造的值。
clang 编译器也支持它们。
它们主要是为了消除编写大量只使用一次的小函数的需要,但也用于防止在一个术语出现多次时出现宏问题;例如:
#define maxint(a,b) \
({int _a = (a), _b = (b); _a > _b ? _a : _b; })
推荐阅读
- google-analytics - GA 管理 API 更新用户自定义维度值、目标跟踪策略
- javascript - 为什么激活 JavaScript 调试时应用程序方面有所不同?
- javascript - 如何在自定义函数运行时中按环境配置函数?
- javascript - javascript 日期格式 yyyy-mm-dd HH:MM:ss
- c - C 非法指令:4 在分配给全局变量时
- c++ - Arduino 和 cmy 库之间的通信中出现“未定义的引用”错误
- reactjs - TS2532 - 对象可能未定义 - useRef 和 react-three-fiber
- python - 导入数学和 TypeError:“builtin_function_or_method”对象不可下标
- docker - Jenkins 在运行时将 NFS 共享安装在容器中的 docker 构建节点
- php - Webscraping Symfony/Panther:无法获取 HTML