Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从本地范围返回值?_C++_C - Fatal编程技术网

C++ 从本地范围返回值?

C++ 从本地范围返回值?,c++,c,C++,C,在我们的代码库中遇到了这样的代码。。。这让我很担心 int foo(int a); // Forward declaration. int baz() { int result = { int a = dosomestuff(); foo(a); } ? 0 : -1; return result; } 此代码的行为是否定义良好 根据foo(a)的返回值,result变量被加载为0或-1,这真的有效吗 有趣的是:代码最初并不是这样

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

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

int baz() {
    int result = {
         int a = dosomestuff();
         foo(a);
    } ? 0 : -1;
    return result;
}
  • 此代码的行为是否定义良好
  • 根据
    foo(a)
    的返回值,
    result
    变量被加载为0或-1,这真的有效吗

  • 有趣的是:代码最初并不是这样写的-但是,我想这个看起来天真无邪的宏将用于

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

    因为它是一个非指针简单类型,所以将返回确切的值,并定义返回行为。那个街区是。。。不过真的很奇怪,我很惊讶有一个C编译器不会被它卡住。

    这是一个对C的GCC扩展,名为“语句表达式”:

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

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

    在您的示例中,这将是
    foo(a)
    返回的任何内容

    但是,为了让GCC接受语法,块必须包含在参数中

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

    我不知道还有哪一个编译器支持这一点。

    我不知道哪一个编译器会接受这一点。此外,您最好这样做:

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

    您必须查阅编译器文档。在标准C或标准C++中不允许使用这种构造。 然而,清理这件事并不重要

    int baz()
    {
        int result;
        {
             int a = dosomestuff();
             result = foo(a)? 0: -1;
        }
        return result;
    }
    
    <不是标准C++ > < /P> 在标准C++中,编写< /P>
    bool baz() { return !foo( dosomestuff() ); }
    

    就是这样。

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

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

    哟。什么样的C编译器接受这个?gcc当然不会。具有讽刺意味的是,gcc似乎是唯一接受它的编译器!参见Michael Burr的答案。编译器是由模拟设备生成的VisualDSP++。明天我可能会要求支持,你先到的。作为一个参考,这里是到所有GCC C扩展的链接,在这个特定的情况下,一个更可移植的方式来编写它可能是合适的。考虑<代码> int结果= FO(DOMSOSTUFF())?0 : -1;@André:当然。语句表达式的用例似乎是帮助创建“参数安全”宏或迭代的宏。我认为没有什么理由在正常功能中使用它们。好的,谢谢。顺便说一句,我使用的编译器也支持这一点(只是为了与GCC兼容)。但是,我们的代码没有使用额外的括号-因此我假设这一定是编译器中的一个错误。实际上,
    BAZ
    可以在标准C中定义为
    #define BAZ()foo(dosomestuff())
    ,它改变了行为--原始函数返回
    0
    -1
    ,但是bool是
    0
    +1
    。是的,我知道函数可以缩短很多。我只是举一个例子,说明使其符合标准所需的最小更改。这种转换纯粹是机械的,因此可以在使用这种结构的任何代码上使用。