首页 > 解决方案 > 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 内核的第一个版本,但我想知道由它包围的代码块({ })代表什么以及它将在哪里使用?

标签: clinux-kernel

解决方案


括号中的复合语句是 GCC 扩展,称为语句表达式。它允许您在需要表达式的地方包含声明、for 循环等。复合语句中的最后一件事应该是一个表达式,后跟一个分号,作为整个构造的值。

clang 编译器也支持它们。

它们主要是为了消除编写大量只使用一次的小函数的需要,但也用于防止在一个术语出现多次时出现宏问题;例如:

#define maxint(a,b) \
       ({int _a = (a), _b = (b); _a > _b ? _a : _b; })

推荐阅读