Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC复合语句表达式内的调用返回_Gcc_Expression - Fatal编程技术网

GCC复合语句表达式内的调用返回

GCC复合语句表达式内的调用返回,gcc,expression,Gcc,Expression,我可以安全地在GCC复合语句表达式中使用return吗 例如,我定义宏 #define CHECK_FUNC_RESULT(func) \ ({ \ int result = func(); \ if (!result) return; \ result; \ }) 并以如下方式在代码中的某个地方使用它: int f

我可以安全地在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返回(在某些情况下==true),而没有任何未定义的行为?

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

这是一种更简洁的方法,可以实现您想要的功能,您还可以将任意数量的参数传递给func(在本例中为3个参数):

用法示例:

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
}

你的回答与问题的主题不符,请你说得更具体一点好吗?如果(CHECK_FUNC_RESULT(function1)){…to do something}other{…do something}在这种情况下,将不执行else。如果不看宏定义,这是不明显的。否则,当if条件中存在return语句时,我找不到任何指向未定义行为的引用。因此,它应该按照您希望的方式工作,但是如果其他人查看代码,它可能会令人困惑。但是问题的主题呢?这是未定义的行为还是否?据我所知,这不会导致未定义的行为。
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
}