块返回值时调用的是什么?

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文档.

  • 我不认为`int x = {int _a = 1; int _b = 2; (1> 2)?_a:_b}`是标准C++中的有效语句.我想这是一个问题. (3认同)

Mik*_*our 7

这称为语句表达式,是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)