2013-05-22 16 views
11
#define DEBUG_BREAK(a)\ 
    if ((a)) \ 
{\ 
    __asm int 3;\ 
} 

Ho definito una macro come sopra, e provare a usarloc definire macro multilinea?

#include "test_define.h" 
int main() 
{ 
    DEBUG_BREAK(1 == 1); 
    return 0; 
} 

Ma questo campione non verrà compilato. Il compilatore si lamenterebbe che la parentesi non è chiusa. Se aggiungo un altro } alla fine del file sorgente, esso viene compilato.

Cosa c'è di sbagliato in questa macro?

+2

Sembra probabile che non ci sia nulla di sbagliato nella macro, ma con qualche altra parte del codice. Tuttavia, macro icky come questo sono difficili da riprendere, quindi è quello che non va. Scrivi invece una funzione. – Lundin

+0

Si prega di non contrassegnare le domande con C e C++ quando si fa riferimento solo a C nel titolo. –

+0

Nulla è fatalmente sbagliato con il codice che si illustra, ma forse c'è un '}' mancante nel '# include'd test_define.h? –

risposta

38

La macro

#define DEBUG_BREAK(a)\ 
    if ((a)) \ 
    __asm int 3; 

funziona bene ma

#define DEBUG_BREAK(a)\ 
    if ((a)) \ 
{\ 
    __asm int 3;\ 
} 

no! E penso che chiunque potrebbe indovinare perché !! Il nuovo operatore di linea è il problema che rende il ragazzo!

Ci vuole

__asm int 3;\ 
} 

come

__asm int 3; } 

dove ; commenti che cosa lo segue (in assemblea). Quindi ci mancherà un } quindi.

+6

Bella cattura. ;-) – DevSolar

6

Verificare che non vi sia spazio bianco dopo ogni barra rovesciata. Spesso mi innamoro di questo.

Potrebbe anche essere necessario un singolo spazio prima del backslash.

0

Questo è strano, ma ottenere {int 3} tra parentesi aiuta. E combinare la macro in singleliner no. Quindi dovrebbe essere qualcosa sull'assemblaggio, non sul multilining.

+0

combinati in una singola linea funziona in vc11. – Jichao

+0

Hm. Ma non in VC6. Puoi provare l'assemblaggio di bracketing nel tuo studio? – akalenuk

+0

Offtopic ma importante: non utilizzare VC6 per nulla. È vecchio, obsoleto e, soprattutto, pieno di bug. – SomeWittyUsername

0

riscriverlo come una funzione inline:

inline void DEBUG_BREAK(bool b) 
{ 
    if (b) 
    { 
     __asm int 3 
    } 
} 

Si consiglia di sostituire il __asm int 3 con DebugBreak(), come quello è la funzione di ufficiale di MS per fare questo.

2
#define DEBUG_BREAK(a)\ 
if ((a)) \ 
{\ 
    __asm \ 
    { \ 
     int 3;\ 
    } \ 
} 

O .... (dal momento che siete su Windows, basta usare la funzione DebugBreak ...)

#define DEBUG_BREAK(a) {if ((a)) DebugBreak();} 
0

Si prega di provare questo

#define DEBUG_BREAK(a)\ 
    if ((a)) \ 
    __asm int 3;