C++ 用do-while-0换行与用(void)0换行三元运算符换行

C++ 用do-while-0换行与用(void)0换行三元运算符换行,c++,c-preprocessor,ternary-operator,C++,C Preprocessor,Ternary Operator,我关注的是微软的GSL: #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__)))) 我的问

我关注的是微软的GSL:

#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__))))
我的问题:这些包装机制有什么不同吗?是否存在某个角落用例,其中一个会导致一些非预期的编译错误,而另一个则不会

注:

    这可能是一个伪装的C问题,我不确定这里是否有真正的C++问题。
    因此,我的技能告诉我,
    CHECK_1
    CHECK_2
    应该完全相同,只是风格问题。我想不出为什么不是这样@NathanOliver似乎同意这一点。

    好吧,这是2行代码,而不是4行代码,所以比4行代码要好100%;)说真的,我想不出一个技术上的原因,一个比另一个好。看起来是一个风格决定。有区别吗?编译后的代码可能对两者都是相同的。就语言而言,1是一个表达式,2是一个语句。所以你可以把1塞进三元组,或者用逗号把它们连起来?这并不是一个好主意。@NathanOliver“看起来像是一个风格决定。”我同意。最后将使这个问题变成POB。@πάνταῥεῖ: 请看编辑。@jakub_d:我实际上认为没有,我想确保我没有遗漏一些模糊的东西。请参见编辑。
    #define CHECK_1(cond) \
        (cond ? static_cast<void>(0) : do_something() )
    
    #define CHECK_2(cond) \
        do { \
            if (not (cond)) {do_something();} \
        } while(0)