在do-while-0中包装与在(void)0中用三元运算符包装

时间:2019-04-10 16:43:31

标签: c++ c-preprocessor ternary-operator

我正在查看Microsoft GSL中的this macro

pool.map

让我们简化一下,以忽略我不关心的内容:

#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() )

我的问题:这些包装机制之间有什么区别吗?也许有一些极端的用例,其中一种会导致一些意外的编译错误,而另一种却不会?

注意:

  • 这实际上可能是变相的C问题,我不确定这里是否有真正的C ++问题。

1 个答案:

答案 0 :(得分:0)

因此,我的Skillz告诉我foreach (var a in collectionOne) { foreach (var b in collectionTwo) { if (a == b.Name) { //do something } } } CHECK_1应该完全等效,只是样式问题。我想不出为什么可能不是这样。 @NathanOliver似乎同意。