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