我想知道为什么这样的代码在编译时会产生以下错误:
1.c:11:错误:'else'之前的预期表达
代码:
#include <stdio.h>
#define xprintk(...) while(0);
int main (void)
{
if (1)
xprintk("aaa\n");
else
xprintk("bbb\n");
return 0;
}
答案 0 :(得分:8)
#define xprintk(...) while(0)
^^ Remove semi-colon
查看预处理后会发生什么
gcc -E test.c
int main (void)
{
if (1)
while(0);; //<- Two semi-colon (i.e. Two statements)
else
while(0);; //<- Two semi-colon
return 0;
}
答案 1 :(得分:0)
这是你的全部代码吗?无论如何,这是因为在宏扩展之后,您的代码遵循以下形式:
if (1)
stmt1;
stmt2;
stmt ... // Possibly more statements than this depending on the macro
else
stmt3;
这不是if-else
构造的有效形式,因此是错误。
答案 2 :(得分:0)
最好的方法是删除宏定义中的分号(如前面的答案),这样它就不会导致重复的分号,并用do {}替换while(0)while(0),这样编译器如果您在使用xprintk()时错过分号,则会报告错误,而不是混淆while循环体的下一个语句。