【发布时间】:2019-05-01 08:29:09
【问题描述】:
考虑下面的 C 代码。
#include <stdio.h>
#define foo(x) if (x>0) printf("Ouch\n");
int main()
{
int a = 4;
int b = -3;
if(a>b)
foo(b) ;
else
printf("Arrg!\n");
printf("thanks\n");
return 0;
}
当程序运行时,我收到一条错误消息error: ‘else’ without a previous ‘if’。当我们根据宏定义把foo(b)替换成if (b>0) printf("Ouch\n")时,程序用大括号写不应该转成下面的代码吗?
if(a>b){
if(x>0){
printf("Ouch\n");
}
}
else{
printf("Arrh!\n");
}
printf("thanks\n");
我不明白为什么编译器会抱怨。程序实际上被转移到什么地方?
谢谢
【问题讨论】:
-
大多数编译器都有一个仅用于预处理的标志。例如
gcc -E。 -
如果想解决这个问题,也很重要stackoverflow.com/questions/154136/…