it-swarm.com.de

c mehrzeiliges Makro definieren?

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

Ich habe ein Makro wie oben definiert und versuche, es zu verwenden

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

Dieses Beispiel wird jedoch nicht kompiliert. Der Compiler würde sich beschweren, dass die Klammer nicht geschlossen ist. Wenn ich am Ende der Quelldatei einen weiteren } hinzufüge, wird dieser kompiliert.

Was ist los mit diesem Makro?

11
Jichao

Das Makro 

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

funktioniert aber gut 

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

tut nicht Und ich denke, jeder könnte raten, warum !! Der neue Linienbetreiber ist der Problemmacher!

Es braucht

 __asm int 3;\
}

wie 

__asm int 3; }

wo ; kommentiert, was folgt (in Assembly). Wir werden also einen } vermissen.

40
raj raj

Vergewissern Sie sich, dass nach jedem Backslash kein Leerzeichen vorhanden ist. Ich falle oft darauf herein.

Möglicherweise benötigen Sie sogar ein Leerzeichen vor dem Backslash.

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

Oder .... (da Sie Windows verwenden, benutzen Sie einfach die DebugBreak-Funktion ...)

#define DEBUG_BREAK(a) {if ((a)) DebugBreak();}
2
selbie

Schreiben Sie es als Inline-Funktion um:

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

Möglicherweise möchten Sie __asm int 3 durch DebugBreak() ersetzen, da dies die offizielle MS-Funktion ist, um dies zu tun. 

0
Mats Petersson

Das ist komisch, aber es hilft, {int 3} in Klammern zu setzen. Und das Kombinieren von Makro in Singleliner nicht. Es sollte also etwas mit Assembly zu tun haben, nicht mit dem Multilining.

0
akalenuk

Bitte versuchen Sie das

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