【问题标题】:wrapping in do-while-0 vs wrapping in a ternary operator with (void)0用 do-while-0 包装与用 (void)0 包装在三元运算符中
【发布时间】: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


【解决方案1】:

所以,我的技能告诉我 CHECK_1CHECK_2 应该完全等效,只是风格问题。我想不出为什么可能不是这样。 @NathanOliver 似乎同意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2021-04-28
    • 1970-01-01
    • 2013-10-07
    • 2015-07-31
    相关资源
    最近更新 更多