从本地范围返回值?

Joh*_*ski 7 c c++

在我们的代码库中碰到了像这样的代码...这让我很担心.

int foo(int a); // Forward declaration.

int baz() {
    int result = {
         int a = dosomestuff();
         foo(a);
    } ? 0 : -1;
    return result;
}
Run Code Online (Sandbox Code Playgroud)
  1. 这段代码的行为是否定义明确?
  2. 它真的有用吗,result变量加载0或-1取决于返回值foo(a)

感兴趣:代码不是原来的那样 - 然而,正是我想象这个看上去无辜的宏将会推出......

int foo(int a); // Forward declaration.

#define BAR()  { int a = dosomestuff(); foo(a); }

int baz() {
    int result = BAR() ? 0 : -1;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 11

这是C的GCC扩展,称为"语句表达式":http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

关键是语句表达式返回它作为表达式值的最后一件事:

复合语句中的最后一件事应该是一个后跟分号的表达式; 此子表达式的值用作整个构造的值.

在你的例子中,那将是任何foo(a)回报.

但是,块必须用Pare括起来以便GCC接受语法.

int foo(); // Forward declaration.

int baz() {
    int result = ({
         int a = dosomestuff();
         foo(a);
    }) ? 0 : -1;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我不知道任何其他支持这个的编译器.

  • 在这种特定情况下,更便于编写它的方式可能是有序的.考虑`int result = foo(dosomestuff())?0:-1;` (4认同)