2013-03-26 10 views
11

Ich habe ein Problem mit einem Makro und ich kann nicht herausfinden, warum. HierWas ist mit diesem Makro falsch?

ist das Makro:

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

Ich habe den Fehler

line "eine Erklärung erwartet" "if (Bedingung) {break;}"

Hat jemand diesen Fehler verstehen?

+1

Sie ändern 'int_loop_wait' nicht innerhalb der Schleife. 'max_time' hat keine Wirkung. – Dipto

+0

Wahr! Ich ändere es jetzt. Ich halte Sie Update – Joze

+2

@ Krishnabhadra Es ist ein Makro, so dass ich nicht das Semikolon wollen (es wird in den Code hinzugefügt werden) – Joze

Antwort

24

Das Problem ist, dass der umgekehrten Schrägstrich durch ein Leerzeichen folgt zusammen als eine Escape-Sequenz erkannt werden, in Wirkung, die den umgekehrten Schrägstrich aufhebt. Visual C++ 10 gibt sogar error C2017: illegal escape sequence dort aus.

Einige der Zeilen im Code-Snippet (z. B. der mit while(1)) enthalten einen oder mehrere Leerzeichen nach dem Backslash. Sobald die umgekehrten Schrägstriche als Escape-Sequenzen behandelt und vom Compiler entfernt wurden, wird die Makrodefinition in dieser Zeile abgeschnitten und der verbleibende Code wird kompiliert, als ob er nicht zur Makrodefinition gehört.

#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

die \ aus der letzten Zeile entfernen

ich ändern bedeuten diese Zeile

} while(0)              \ 

von

} while(0) 

und entfernen Sie alle Leerzeichen nach dem \

haben Sie ein paar Zeilen die nach demLeerzeichen enthaltenmag:

while(1)         \  
     {           \   
+0

Sie haben Recht darüber, aber ich bekomme immer noch den Fehler:/ – Joze

+1

@Joze alle Leerzeichen nach dem '\\ entfernen'. Antwort aktualisiert – MOHAMED

+0

Irgendeine Idee, warum Räume das Problem verursachen? – sharptooth

5

Der Täter nach \ weißen Raum. Entfernen sie wird gelöst.

Die Makrodefinition wird fortgesetzt, wenn die Zeile mit \ endet, aber nicht mit dem Leerzeichen oder einem anderen Zeichen.

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