我想知道为什么这样的代码在编译时会产生以下错误:
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;
}
#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;
}
这是您的全部代码吗?无论如何,这是因为在宏扩展之后,您的代码遵循以下形式:
if (1)
stmt1;
stmt2;
stmt ... // Possibly more statements than this depending on the macro
else
stmt3;
这不是if-else
构造的有效形式,因此是错误的。
最好的方法是删除宏定义中的分号(如上一个答案),这样就不会导致重复的分号,并将 while(0) 替换为 do{}while(0),这样编译器会报告一个如果您在使用 xprintk() 时错过了分号,则会出错,而不是混淆 while 循环主体的下一条语句。