web-dev-qa-db-fra.com

c définir une macro multiligne?

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

J'ai défini une macro comme ci-dessus et j'essaie de l'utiliser

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

Mais cet exemple ne sera pas compilé. Le compilateur se plaindrait que la parenthèse n'est pas fermée. Si j'ajoute un autre } à la fin du fichier source, il se compile.

Quel est le problème avec cette macro?

11
Jichao

La macro 

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

fonctionne bien mais 

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

non! Et je pense que tout le monde peut deviner pourquoi !! Le nouvel opérateur de ligne est le type qui fait le problème!

Ça prend

 __asm int 3;\
}

comme 

__asm int 3; }

; commente ce qui suit (dans Assembly). Donc, nous allons manquer un } alors.

40
raj raj

Vérifiez qu'il n'y a pas d'espace blanc après chaque barre oblique inverse. Je tombe souvent pour ça.

Vous pourriez même avoir besoin d'un seul espace avant la barre oblique inverse.

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

Ou .... (puisque vous êtes sous Windows, utilisez simplement la fonction DebugBreak ...)

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

Réécrivez-le en tant que fonction inline:

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

Vous voudrez peut-être remplacer __asm int 3 par DebugBreak(), car il s’agit de la fonction officielle de MS pour le faire. 

0
Mats Petersson

C'est bizarre, mais il est utile de mettre {int 3} entre parenthèses. Et combiner macro dans singleliner ne le fait pas. Cela devrait donc concerner l’Assemblée, pas la multiligne.

0
akalenuk

S'il vous plaît essayer ceci

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