2013-09-15 2 views
0

мне интересно, почему такой код генерирует следующее сообщение об ошибке при компиляции:НКУ ошибка: ожидается выражение, прежде чем «еще»

1.c: 11: ошибка: ожидается выражение, прежде чем «еще»

код:

#include <stdio.h> 

#define xprintk(...) while(0); 


int main (void) 
{ 
if (1) 
    xprintk("aaa\n"); 
else 
    xprintk("bbb\n"); 

return 0; 
} 

ответ

8
#define xprintk(...) while(0) 
           ^^ Remove semi-colon 

Посмотрите, что происходит после предварительной обработки

gcc -E test.c

int main (void) 
{ 
if (1) 
    while(0);; //<- Two semi-colon (i.e. Two statements) 
else 
    while(0);; //<- Two semi-colon 

return 0; 
} 
0

Это весь ваш код? Независимо от того, что это потому, что после того, как макрорасширений код следует форме:

if (1) 
    stmt1; 
    stmt2; 
    stmt ... // Possibly more statements than this depending on the macro 
else 
    stmt3; 

Это не является допустимой формой для if-else конструкции, следовательно, ошибка.

+1

Добавление к тому, что вы упомянули выше, наличие брекетов вокруг блока условий if также решит проблему. Но это похоже на обходной путь к реальной проблеме. –

0

Лучший способ удалить точку с запятой в определении макроса (как в предыдущем ответе), поэтому он не ведет дублировать точки с запятой и заменить while (0) на do {} while (0), таким образом компилятор сообщит об ошибке, если вы пропустите точку с запятой, когда используете xprintk(), вместо того, чтобы путать следующий оператор для тела цикла while.

Смежные вопросы