这个宏有什么问题?

时间:2013-03-26 11:10:56

标签: c macros

我遇到了宏的问题,我无法弄清楚原因。

这是宏:

#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”

有没有人理解这个错误?

3 个答案:

答案 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)