理解用作函数的宏

Understanding macros used as functions

在这段代码中,我无法理解 FUNCTION(func,pred) 应该做什么。

#define FUNCTION(func,pred)\
void func(int& a, int x){  \
if(!(a pred x)) a = x;     \
}

这个我也看不懂:

FUNCTION(minimum, <)
FUNCTION(maximum, >)

有人可以解释一下吗?

preprocessor 将所有标记:FUNCTION(func,pred) 替换为

void func(int& a, int x){
if(!(a pred x)) a = x;
}

因此,用二元运算符定义一个函数funcpred。所以,当你这样写的时候:

FUNCTION(minimum,<)

预处理器 replaces 具有:

void minimum(int& a, int x){
   if(!(a < x))
    a = x;
}

同样的事情发生在:

FUNCTION(maximum,>)

产生:

void maximum(int& a, int x){
   if(!(a > x))
    a = x;
}

...等等..

FUNCTION正在定义一个名为func的函数。例如:

FUNCTION(minimum, <)

会像这样定义一个函数:

void minimum(int& a, int x) {
    if(!(a < x)) {
        a = x;
    }
}

宏是一种代码生成方法。这段代码的作者显然觉得写出这2行函数太费力了,反而用宏来混淆大家。

这绝对是宏有害(可读性)而不是帮助的情况。对于这样的基本功能,我不建议这样做。