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

Mam zdefiniowane makra jak wyżej, i starają się toc zdefiniować makro multilinii?

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

używać Ale ta próba nie będzie skompilować. Kompilator skarżyłby się, że nawias nie jest zamknięty. Jeśli dodaję kolejny } na końcu pliku źródłowego, kompiluje.

Co jest nie tak z tym makro?

+2

Wydaje się prawdopodobne, że makro nie zawiera błędów, ale z inną częścią kodu. Jednak icky makra, takie jak ten, są kłopotliwe, więc to jest z tym nie tak. Zamiast tego wpisz funkcję. – Lundin

+0

Nie należy oznaczać etykietami pytań w językach C i C++, jeśli odwołujesz się tylko do litery C w tytule. –

+0

Nic nie jest fatalnie błędne w kodzie, który zilustrowałeś, ale może jest brakujące '}' w '# include'd test_define.h? –

Odpowiedz

38

Makro

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

działa dobrze, ale

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

nie! I myślę, że każdy może zgadnąć, dlaczego! Nowy operator linii jest facetem, który sprawia problemy!

Zajmuje

__asm int 3;\ 
} 

jak

__asm int 3; } 

gdzie ; komentarze, co wynika (w pełnym składzie). Więc wtedy będziemy tęsknić za }.

+6

Przyjemny połów. ;-) – DevSolar

6

Sprawdź, czy po każdym ukośniku odwrotnym nie ma spacji. Często na to wpadam.

Przed odwrotnym ukośnikiem może być potrzebne nawet spacja.

0

To dziwne, ale uzyskanie {int 3} w nawiasach pomaga. A łącząc makro w singleliner nie. Powinno to być coś o montażu, a nie multiliningu.

+0

łączyć w jedną linię działa w vc11. – Jichao

+0

Hm. Ale nie w VC6. Czy możesz spróbować zamontować zespół bracketingu w swoim studio? – akalenuk

+0

Offtopic, ale ważne: nie używaj VC6 do niczego. Jest stary, przestarzały i, co najważniejsze, pełen błędów. – SomeWittyUsername

0

Przepisz go jako funkcja inline:

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

Możesz zastąpić __asm int 3 z DebugBreak(), jak to jest oficjalna funkcja MS to zrobić.

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

Albo .... (skoro jesteś na Windows, wystarczy skorzystać z funkcji DebugBreak ...)

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

Spróbuj tego

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