c定义多行宏?

时间:2013-05-22 06:50:41

标签: c macros

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

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

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

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

这个宏出了什么问题?

6 个答案:

答案 0 :(得分:40)

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

工作正常,但

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

不!我想任何人都可以猜到为什么!新的线路运营商是制造问题的人!

需要

 __asm int 3;\
}

as

__asm int 3; }

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

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

或....(因为你在Windows上,只需使用DebugBreak函数......)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

将其重写为内联函数:

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

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

答案 5 :(得分:0)

请试试这个

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