为什么'max'宏在C中定义如下?

com*_*ler 8 c macros

 #define max(a,b) \
   ({ typeof (a) _a = (a); \
       typeof (b) _b = (b); \
     _a > _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)

为什么不简单(a>b ? a : b)

xan*_*tos 19

因为其他人max(f(1), f(2))会两次调用这两个函数中的一个:

f(1) > f(2) ? f(1) : f(2)
Run Code Online (Sandbox Code Playgroud)

相反,通过"缓存"两个值_a,_b你有

({
    sometype _a = (a);
    sometype _b = (b);

    _a > _b ? _a : _b;
})
Run Code Online (Sandbox Code Playgroud)

(显然正如其他人所指出的那样,自动增量/自动减量存在同样的问题)

我认为Visual Studio不支持这种方式.这是一个复合语句.在这里阅读msvc有gcc的模拟({})

我将在这里给出的gcc手册中添加复合语句的定义http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC62显示的代码非常类似于其中一个问题最多:-)


pax*_*blo 8

它正在绕过诸如此类的主要问题

#define max(a,b) ((a) > (b) ? a : b)
Run Code Online (Sandbox Code Playgroud)

当你用它来调用它时:

int x = max (a++, b--);
Run Code Online (Sandbox Code Playgroud)

由于它是简单的文本替换,因此导致:

int x = ((a++) > (b--) ? a++ : b--);
Run Code Online (Sandbox Code Playgroud)

不是你想要的.

通过使用:

#define max(a,b) ({
    typeof (a) _a = (a);\
    typeof (b) _b = (b); \
    _a > _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)

它使用临时变量,有效地为您提供:

int x = ({ int _a = a++; int _b = b--; _a > _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)

只运行一次副作用.

但是,说实话,你应该完全抛弃那个宏并使用一个inline函数,甚至是一个非内联函数,因为大多数时候,即使没有这个建议,编译器也可以做一个不错的优化工作.