我偶然發現了一篇內容豐富的文章: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