在我们的代码库中碰到了像这样的代码...这让我很担心.
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)
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)
我不知道任何其他支持这个的编译器.