为什么这个 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;
}
我有一段代码使用下面的 #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;
}