12

我面临一个宏的问题,我不知道为什么。

这是宏:

#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)                                  \

我得到了错误

“预期声明”行“ if(condition) { break; }”

有人理解这个错误吗?

4

3 回答 3

31

问题是反斜杠后面跟着一个空格被一起识别为一个转义序列,它实际上取消了反斜杠。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)                                  \
于 2013-03-26T11:47:58.317 回答
9

\从最后一行删除

我的意思是改变这条线

 } while(0)                                                     \

经过

 } while(0)

并删除之后的所有空格\

你有一些包含空格的行\

while(1)                                  \    
      {                                         \           
于 2013-03-26T11:14:59.873 回答
6

罪魁祸首是\. 删除它们将解决。

如果行以 结尾\,但不以空格或任何其他字符结尾,则宏定义继续。

#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)  
于 2013-03-26T11:24:18.040 回答