2013-03-26 1 views
11

Sto affrontando un problema con una macro e non riesco a capire perché.Cosa c'è di sbagliato in questa macro?

Ecco la macro:

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

ho ottenuto l'errore

"prevede una dichiarazione" linea "if (condizione) {break;}"

C'è qualcuno capisci questo errore?

+1

Non si modifica 'int_loop_wait' all'interno del ciclo. 'max_time' non ha alcun effetto. – Dipto

+0

Vero! Lo cambio adesso. Ti tengo aggiornato – Joze

+2

@ Krishnabhadra È una macro, quindi non voglio il punto e virgola (verrà aggiunto nel codice) – Joze

risposta

24

Il problema è che la barra rovesciata seguita da uno spazio bianco sono insieme riconosciuto come una sequenza di escape che in effetti annulla la barra rovesciata. Visual C++ 10 emette anche error C2017: illegal escape sequence lì.

Alcune delle righe nello snippet di codice (ad esempio quello con while(1)) contengono uno o più spazi bianchi dopo il backslash. Una volta che i backslash sono trattati come sequenze di escape e rimossi dal compilatore, la definizione della macro viene troncata su quella riga e il codice rimanente viene compilato come se non appartenesse alla definizione della macro.

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

rimuovere il \ dall'ultima riga

intendo cambiare questa linea

} while(0)              \ 

da

} while(0) 

e rimuovere tutti gli spazi dopo il \

si dispone di alcune linee che contengono spazi dopo lo \ piace:

while(1)         \  
     {           \   
+0

Hai ragione, ma ottengo ancora l'errore:/ – Joze

+1

@Joze rimuovi tutti gli spazi dopo \\. risposta aggiornata – MOHAMED

+0

Qualche idea sul perché gli spazi causano il problema? – sharptooth

5

Il colpevole è uno spazio bianco dopo \. Rimozione li risolverà.

La definizione della macro continua se la linea termina con \, ma non con lo spazio o qualsiasi altro carattere.

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