gcc错误:'else'之前的预期表达式

时间:2013-09-15 05:23:07

标签: c gcc

我想知道为什么这样的代码在编译时会产生以下错误:

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;
}

3 个答案:

答案 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循环体的下一个语句。