我可以安全地在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)返回而没有任何未定义的行为吗?
答案 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
}