2014-02-17 28 views
6

我可以安全地在GCC复合语句表达式中使用返回值吗?在GCC复合语句表达式中调用返回信息

比如我定义宏

#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 ==真)没有任何未定义行为?

回答

0

它应该可以工作,但是if()语句只会在function1返回1时处理(在你的例子中:从不)。这看起来像一个危险的建筑,因为其他的东西永远不会被执行。

+0

请, 你可以说得更详细点吗 ? – Andigor

+0

如果(CHECK_FUNC_RESULT(功能1)){ ...做一些 }其他{ ...做别的事情 } 在这种情况下,否则将不被执行。不看宏观的定义,这并不明显。 否则,如果if条件中存在return语句,我找不到指向未定义行为的任​​何引用。所以它应该按照你打算工作的方式工作,但是如果其他人看着代码,它可能会令人困惑。 –

+0

但是这个问题的话题呢?这是未定义的行为还是不行? – Andigor

0

一个更清洁的方式来实现你想要什么,你也可以通过任意数量的参数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 
} 
+0

你的答案与问题的主题不符 – Andigor