#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?
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; }
où ;
commente ce qui suit (dans Assembly). Donc, nous allons manquer un }
alors.
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.
#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();}
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.
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.
S'il vous plaît essayer ceci
#define DEBUG_BREAK(a)\
if ((a)) \
__asm int 3;