Что случилось с этим макросом?

У меня проблема с макросом, и я не могу понять, почему.

Вот макрос:

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

Кто-нибудь понимает эту ошибку?

Ответ 1

Проблема заключается в том, что обратная косая черта, сопровождаемая пробелом, вместе распознается как escape-последовательность, которая фактически отменяет обратную косую черту. Visual С++ 10 даже испускает error C2017: illegal escape sequence там.

Некоторые строки в фрагменте кода (например, с while(1)) содержат одно или несколько пробелов после обратного слэша. Как только обратная косая черта рассматривается как escape-последовательности и удаляется компилятором, определение макроса усекается в этой строке, а оставшийся код компилируется так, как будто он не относится к определению макроса.

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

Ответ 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)