0

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

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

3 回答 3

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;
}
于 2013-09-15T05:25:57.210 回答
0

这是您的全部代码吗?无论如何,这是因为在宏扩展之后,您的代码遵循以下形式:

if (1) 
    stmt1; 
    stmt2; 
    stmt ... // Possibly more statements than this depending on the macro
else 
    stmt3; 

这不是if-else构造的有效形式,因此是错误的。

于 2013-09-15T05:25:11.823 回答
0

最好的方法是删除宏定义中的分号(如上一个答案),这样就不会导致重复的分号,并将 while(0) 替换为 do{}while(0),这样编译器会报告一个如果您在使用 xprintk() 时错过了分号,则会出错,而不是混淆 while 循环主体的下一条语句。

于 2013-09-15T05:35:17.443 回答