【发布时间】:2019-09-01 04:58:43
【问题描述】:
我正在查看 Microsoft 的 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)
我的问题:这些包装机制之间有什么区别吗?是否可能存在一些角落用例,其中一个会导致一些意外的编译失误,但不会导致另一个?
注意:
- 这实际上可能是一个伪装的 C 问题,我不确定这里是否存在任何真正的 C++ 问题。
【问题讨论】:
-
嗯,它是 2 行代码 vs 4 行代码,所以它好 100% ;) 说真的,虽然我想不出一个比另一个更好的技术原因。看起来像是一种风格决定。
-
有区别吗?两者的编译代码可能相同。就语言而言,1 是表达式,2 是语句。所以你可以将 1 塞入三元组和/或使用逗号将它们链接起来?并不是说这实际上是一个好主意。
-
@NathanOliver “看起来像是一种风格决定。” 我同意。最后会提出这个问题。
-
@πάνταῥεῖ:见编辑。
-
@jakub_d:我实际上认为没有,想确保我没有遗漏一些晦涩的东西。见编辑。
标签: c++ c-preprocessor ternary-operator