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



我可以安全地在 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
   }
}

我可以期望从函数 2(在 some_condition == true 上)返回而没有任何未定义的行为吗?

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

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

#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
}

最新更新