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)含む行)には、円記号の後に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 に答える