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