我遇到了宏的问题,我无法弄清楚原因。
这是宏:
#define WAIT(condition, max_time) \
do { \
int int_loop_wait=0; \
while(1) \
{ \
if(condition) { break; } \
sleep(1); \
if(int_loop_wait>=max_time) { break; } \
int_loop_wait++; \
} \
} while(0) \
我收到了错误
“如果(条件){break;}”
,则预期声明为“line”
有没有人理解这个错误?
答案 0 :(得分:26)
问题是后跟空格的反斜杠一起被识别为转义序列,它实际上取消了反斜杠。 Visual C ++ 10甚至在那里发出error C2017: illegal escape sequence
。
代码段中的某些行(例如带有while(1)
的行)在反斜杠后包含一个或多个空格。一旦反斜杠被视为转义序列并被编译器删除,宏定义就会在该行被截断,剩下的代码被编译为好像它不属于宏定义。
#define WAIT(condition, max_time) \
do { \
int int_loop_wait=0; \
while(1) \ <<<<<WHITESPACES
{ \<<<this line doesn't belong to macro
if(condition) { break; } \<<<and neither does this
sleep(1); \
if(int_loop_wait>=max_time) { break; } \
int_loop_wait++; \
} \
} while(0) \
答案 1 :(得分:6)
从最后一行删除\
我的意思是改变这一行
} while(0) \
通过
} while(0)
并删除\
你有一些行在\
之后包含空格:
while(1) \
{ \
答案 2 :(得分:5)
罪魁祸首是\
之后的空白区域。删除它们将解决。
如果行以\
结尾,但不以空格或任何其他字符结束,则宏定义继续。
#define WAIT(condition, max_time) \
do { \
int int_loop_wait=0; \
while(1){ \
if(condition) { break; } \
sleep(1); \
if(int_loop_wait>=max_time) { break; } \
} \
} while(0)