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
。是的,我知道函数可以缩短很多。我只是举一个例子,说明使其符合标准所需的最小更改。这种转换纯粹是机械的,因此可以在使用这种结构的任何代码上使用。