从本地范围返回值?

时间:2010-12-08 18:44:26

标签: c++ c

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

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

int baz() {
    int result = {
         int a = dosomestuff();
         foo(a);
    } ? 0 : -1;
    return result;
}
  1. 此代码的行为是否定义明确?
  2. 是否真的有效,result变量加载0或-1,具体取决于foo(a)的返回值?

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

    int foo(int a); // Forward declaration.
    
    #define BAR()  { int a = dosomestuff(); foo(a); }
    
    int baz() {
        int result = BAR() ? 0 : -1;
        return result;
    }
    

6 个答案:

答案 0 :(得分: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;
}

我不知道任何支持此功能的其他编译器。

答案 1 :(得分:4)

您必须查阅编译器文档。标准C或标准C ++中不允许使用此结构。

然而,清除它是微不足道的,例如

int baz()
{
    int result;
    {
         int a = dosomestuff();
         result = foo(a)? 0: -1;
    }
    return result;
}

答案 2 :(得分:1)

我不知道单个编译器会接受它。另外,你最好这样做:

int foo();
int dosomestuff();

int baz()
{
   int result = foo(dosomestuff()) ? 0 : -1;
   return result;
}

答案 3 :(得分:1)

这不是标准的C ++。

在标准C ++中,写

bool baz() { return !foo( dosomestuff() ); }

就是这样。

答案 4 :(得分:0)

因为它是一个非指针简单类型,所以将返回确切的值,因此定义了返回行为。那个块真的很奇怪,我很惊讶那里的C编译器不会在那里窒息。

答案 5 :(得分:0)

使用C ++ 11,您可以非常接近:

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

int baz() {
    int result = []{
         int a = dosomestuff();
         return foo(a);
    }() ? 0 : -1;
    return result;
}