在我们的代码库中碰到了这样的代码......让我很担心。
int foo(int a); // Forward declaration.
int baz() {
int result = {
int a = dosomestuff();
foo(a);
} ? 0 : -1;
return result;
}
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;
}
答案 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;
}