我偶然发现了一篇内容丰富的文章:http://cnicholson.net/2009/02/stupid-c-tricks-adventures-in-assert/ 其中指出了我当前调试宏套件中存在的大量问题。自定义C++声明宏
如果您关注该链接,则会在文章结尾处给出宏的最终版本的完整代码。
所呈现的一般形式是这样的(有人请纠正我,如果我在调换它是错的):
#ifdef DEBUG
#define ASSERT(cond) \
do \
{ \
if (!(cond)) \
{ \
ReportFailure(#cond, __FILE__, __LINE__, 0); \
HALT(); \
} \
} while(0)
#else
#define ASSERT(cond) \
do { (void)sizeof(cond); } while(0)
虽然想修改我的代码有什么我已经学会了,我注意到一对夫妇有趣的变化张贴在该文章的意见:
一个是你不能使用这个宏与三元运算符(即cond?ASSERT(x):func()
),并建议将if()
替换为三元运算符和一些括号以及逗号运算符。后来另一位评论者提供这样的:
#ifdef DEBUG
#define ASSERT(x) ((void)(!(x) && assert_handler(#x, __FILE__, __LINE__) && (HALT(), 1)))
#else
#define ASSERT(x) ((void)sizeof(x))
#endif
我想使用的逻辑和&&
在这种情况下,特别聪明,在我看来,这个版本比一个使用if
甚至三元?:
更加灵活。更好的是,assert_handler
的返回值可以用来确定程序是否应该停止。虽然我不确定它为什么是(HALT(), 1)
而不是HALT()
。
这里有我忽略的第二个版本有什么特别的缺点吗?它消除了围绕宏的do{ } while(0)
,但在这里似乎没有必要,因为我们不需要处理if
s。
您认为如何?
+1。有趣的链接。 – Maxpm 2011-03-09 21:35:52
另请参见我的答案如下:http://stackoverflow.com/a/21827201/216063 – 2014-04-26 12:41:24