【问题标题】:are there problems with this macro - check status and return if failed这个宏是否有问题 - 检查状态并在失败时返回
【发布时间】:2011-01-06 13:03:41
【问题描述】:

我们在代码中有经常重复出现的行来检查函数的返回状态,如果失败则立即返回状态。我想为此定义一个宏:

#define RETURN_IF_FAILED(x) { int stat = (x); if (FAILED(stat)) return stat; }

局部变量是因为参数x可能是函数调用。

据我所知,使用宏有一些奇怪的伪影,而且我对它们不是很精通,所以我想问一下您是否发现这个宏有任何问题。谢谢。

(请不要建议使用例外 - 我自己也讨厌这种风格,但这里就是这样)

【问题讨论】:

    标签: c++ macros error-handling


    【解决方案1】:

    我想稍微修改一下;像这样用do{} while(0) 括起来:

    #define RETURN_IF_FAILED(x) do { int stat = (x); if (FAILED(stat)) return stat; } while(0)
    

    现在你可以像这样使用这个宏了:

    if (SomeCondition)
      RETURN_IF_FAILED(x); //<--- note the "usual" semicolon!
    else
    {
       //some code
    }
    

    使用您的版本,此代码根本不可能。宏后面的; 会导致您的版本出现问题!

    【讨论】:

    • @davka:没错。 ; 是问题所在!
    • 为什么是do{ 和}while(0)? t {` 和} 够吗?
    • @peoro :; 会导致问题。尝试在我给出的代码 sn-p 中扩展原始宏。你会立即看到这个!
    • @peoro:不,因为if { ... }; else ...会产生编译错误。
    • 哎哟!我错过了你回答的全部要点......在评论之前应该阅读答案两次......
    猜你喜欢
    • 2020-08-22
    • 2019-12-31
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多