【问题标题】:What's wrong with this macro?这个宏有什么问题?
【发布时间】:2013-03-26 11:10:56
【问题描述】:

我遇到了一个宏问题,我不知道为什么。

这里是宏:

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

有人理解这个错误吗?

【问题讨论】:

  • 您没有在循环内更改int_loop_wait。 max_time 无效。
  • 真的!我现在改变它。我让你更新
  • @Krishnabhadra 是宏,所以不要分号(代码里会加)
  • @Krishnabhadra,如果你想在代码中的某处写WAIT(condition, max_time);,则不需要;
  • 宏调用在哪里?

标签: c macros


【解决方案1】:

问题是反斜杠后跟一个空格被一起识别为转义序列,实际上取消了反斜杠。 Visual C++ 10 甚至会在那里发出 error C2017: illegal escape sequence。

代码 sn-p 中的某些行(例如带有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)                                  \

【讨论】:

    【解决方案2】:

    从最后一行删除\

    我的意思是改变这一行

     } while(0)                                                     \
    

    通过

     } while(0)
    

    并删除\之后的所有空格

    你有一些在\ 之后包含空格的行,例如:

    while(1)                                  \    
          {                                         \           
    

    【讨论】:

    • 知道为什么空格会导致问题吗?
    • 空白会让你得到一些穿着就是这样..就像 c.c:4:49: 警告:反斜杠和换行符由空格分隔 [默认启用] c.c:5:49: 警告:反斜杠和换行符空格分隔[默认启用]
    【解决方案3】:

    罪魁祸首是\ 后面的空格。删除它们将解决。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2012-05-26
      相关资源
      最近更新 更多