Mat*_* G. 7 c c++ gcc terminology
我最近遇到了这个代码,这对我来说看起来不合法(但是gcc编译它).我不介意构造,因为它想要一个名字:
#define MAX(a,b) \
({ \
typeof(a) _a = (a); \
typeof(b) _b = (b); \
(_a > _b) ? (_a) : (_b); \
})
Run Code Online (Sandbox Code Playgroud)
显然,最后一个语句的值将作为由命名空间限定的表达式的"值"返回.
编辑:谢谢你们的答案.事实证明,这是对称为Statement Expressions的普通C的扩展.
Alo*_*ave 12
它不是命名空间,它是一个返回最多两个值的宏.
\在语句的末尾用于附加多个语句并创建一个多行宏.
代码不是标准的C++,但它在gcc中编译,因为它作为gcc编译器扩展支持.
好读:
语句表达式:
复合语句是由大括号括起来的一系列语句.在GNU C中,括号内的复合语句可能在所谓的a中表示为表达式Statement expression.
.--------------.
V |
>>-(--{----statement--;-+--}--)--------------------------------><
Run Code Online (Sandbox Code Playgroud)
语句表达式的值是要在整个构造中出现的最后一个简单表达式的值.如果最后一个语句不是表达式,则构造的类型为void且没有值.
注意:此摘录摘自IBM XL C/C++ v7.0文档.
这称为语句表达式,是GCC 的非标准扩展.它允许您将复合语句用作表达式,其值由复合语句中的最后一个表达式给出.
它用于避免类似函数的宏可能多次评估其参数的问题,如果这些评估具有副作用,则会产生意外行为.宏被仔细地编写以评估a并且b恰好一次.
在C++中,你永远不需要做这样的事情 - 而是使用函数模板:
template <typename T> T max(T const & a, T const & b) {
return a > b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)