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

问题描述 投票:-1回答:1

我正在微软的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 ++问题。
c++ c-preprocessor ternary-operator
1个回答
0
投票

所以,我的技巧告诉我,CHECK_1CHECK_2应该完全等同,只是风格问题。我想不出为什么会出现这种情况。 @NathanOliver似乎同意。

© www.soinside.com 2019 - 2024. All rights reserved.