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

我已经像上面定义了一个宏,并尝试使用它

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

但是这个示例不会编译。编译器会抱怨括号没有关闭。如果我}在源文件的末尾添加另一个,它会编译。

这个宏有什么问题?

4

6 回答 6

39

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

工作正常,但

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

没有!我想任何人都可以猜到为什么!新的生产线操作员是问题制造者!

它需要

 __asm int 3;\
}

作为

__asm int 3; }

where;注释掉它后面的内容(在汇编中)。所以我们会错过一个}那时。

于 2013-05-22T07:25:40.987 回答
6

检查每个反斜杠后没有空格。我经常为此而堕落。

您甚至可能在反斜杠之前需要一个空格。

于 2013-05-22T06:55:37.600 回答
2
#define DEBUG_BREAK(a)\
if ((a)) \
{\
    __asm \
    { \
        int 3;\
    } \
}

或者....(由于您在 Windows 上,只需使用 DebugBreak 功能...)

#define DEBUG_BREAK(a) {if ((a)) DebugBreak();}
于 2013-05-22T07:18:35.063 回答
0

这很奇怪,但是将 {int 3} 放入括号会有所帮助。并且将宏组合到单行器中不会。所以它应该是关于装配的东西,而不是多线。

于 2013-05-22T07:04:10.627 回答
0

将其重写为内联函数:

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

您可能需要替换__asm int 3DebugBreak(),因为这是执行此操作的官方 MS 功能。

于 2013-05-22T07:14:34.743 回答
0

请试试这个

#define DEBUG_BREAK(a)\
    if ((a)) \
    __asm int 3;
于 2013-05-22T07:24:51.987 回答