为什么这个 C 宏函数计算 2 个数字的和会产生错误?

Why does this C macro function calculating sum of 2 numbers generate error?

我有一段代码使用下面的 #define 来计算 2 个数字的总和:

#include <stdio.h>

#define sum(a, b) \
    int res = 0;    \
    res += (a + b); \
    (res ? res : 0)

int main () {
    printf("%d ", sum(3, 4));
    return 0;
}

编译上层代码时,发现错误:

error: expected expression before 'int'
     int res = 0;    \
note: in expansion of macro 'sum'     
     printf("%d ", sum(3, 4));

那么,这个错误是什么意思?而且,我该如何解决这个问题?

谢谢

如果你运行你的程序通过像gcc -E program.c这样的C预处理器,那么你将在结束时有以下内容:

int main () {
    printf("%d ", int res = 0; res += (3 + 4); (res ? res : 0));
    return 0;
}

这是无效代码。

要解决此问题,您需要修复 sum

的宏
#include <stdio.h>

#define sum(a, b) ((a) + (b))

int main () {
    printf("%d ", sum(3, 4));
    return 0;
}

您需要使用括号来防止可能滥用运算符优先级的运算符,例如 ++ 或 --。这在这里不是问题,但总的来说这是一个很好的做法。

更好的选择是为此类工作编写一个内联函数。

如果您使用 GCC,那么它有一个非标准的因此不可移植的扩展,允许 statement expressions,它允许您在一个表达式中放置多个语句。

我真的不推荐使用它,但它可以作为一个宏来做你想做的事:

#define sum(a, b) \
    ({ int res = 0;    \
       res += (a + b); \
       (res ? res : 0) })

但正确的解决方案是改用函数,并依靠编译器正确地内联它(需要您的一点“提示”):

inline int sum(int a, int b)
{
    return a + b;
}