在GCC复合语句表达式中调用return

时间:2014-02-17 10:03:07

标签: gcc expression

我可以安全地在GCC复合语句表达式中使用return吗?

例如我定义宏

#define CHECK_FUNC_RESULT(func)    \
({                                 \
   int result = func();            \
   if (!result) return;            \
   result;                         \
})

并以这种方式在代码中的某处使用它:

int function1() 
{
   if (some_condition) 
     return 0;
   ...
   return 1; 
}

void function2()
{
   if(CHECK_FUNC_RESULT(function1)) {
      ... to do something
   }
}

我可以期待从function2(on some_condition == true)返回而没有任何未定义的行为吗?

2 个答案:

答案 0 :(得分:0)

它应该可以工作,但只有当function1返回1时才会处理你的if()语句(在你的例子中:never)。这看起来像一个危险的结构,因为别的东西永远不会被执行。

答案 1 :(得分:0)

一种更清晰的方式来实现你想要的东西,你也可以将任意数量的参数传递给func(在这个例子中是3个args):

#define RET_IF_ZERO(func, args) \
do {                            \
    int result = func args;     \
    if (!result)                \
        return;                 \
} while (0)

使用示例:

void function1(int arg1, int arg2, int arg3)
{
    if (some_condition) 
        return 0;
    ...
    return 1;
}

void function2()
{
   RET_IF_ZERO(function1, (arg1, arg2, arg3)));

   ... do to something
}