我正在微软的GSL中查看this macro:
#define GSL_CONTRACT_CHECK(type, cond) \
(GSL_LIKELY(cond) ? static_cast<void>(0) \
: gsl::details::throw_exception(gsl::fail_fast( \
"GSL: " type " failure at " __FILE__ ": " GSL_STRINGIFY(__LINE__))))
让我们简化一下,忽略我不关心的事情:
#define CHECK_1(cond) \
(cond ? static_cast<void>(0) : do_something() )
现在,我会直观地写出类似的东西:
#define CHECK_2(cond) \
do { \
if (not (cond)) {do_something();} \
} while(0)
我的问题:这些包装机制有什么区别吗?是否有一些角落用例,其中一个导致一些意外的编译失态,而不是另一个?
注意:
所以,我的技巧告诉我,CHECK_1
和CHECK_2
应该完全等同,只是风格问题。我想不出为什么会出现这种情况。 @NathanOliver似乎同意。