c定义多行宏?

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

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

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

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

这个宏有什么问题?

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

工作正常但是

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

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

它需要

  __asm int 3;\ } 

 __asm int 3; } 

哪里; 评论它后面的内容(在汇编中)。 所以我们会错过一个}

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

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

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

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

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

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

将其重写为内联函数:

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

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

请试试这个

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