关于`({});`的更多信息?
我注意到有时,C宏被写成这样的东西:
#define foo(bar) ({ ++bar; })
经过一些实验,我发现:
-
({});
会编译,但什么都不做。 (正如所料。) - 离开
;
off会导致语法错误。 这样做的副作用是确保foo()看起来像代码中的函数。 (虽然,如果关闭分号,错误对诊断问题不是很有用!) -
return ({});
抱怨虚假值不被忽略,就像我试图使用void函数一样。
这只是为了让开发人员在他们的宏中添加分号,还是有另一个目的? 我已经尝试过谷歌,但是标点符号失败了。 这有名字吗?
这是一个名为语句表达式的GNU扩展。
在标准C中声明宏时,您经常会看到do...while(0)
循环用于类似目的(即创建块作用域)。 语句表达式优于循环黑客,因为它可以返回值。 如果你想在标准C中做类似的事情,你必须定义一个额外的function,并失去词法范围的便利。
关于语句表达式的一件很酷的事情(如果有一件很酷的事情)是最后一个语句是表达式的结果。
#define foo(bar) ({ ++bar; 3.1415927; }) int i = 0; float pi = foo(i);
()是一个表达式。 ({code; code;})是表达式中的复合语句。 这是一个GNU C扩展。
http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html
编辑:哇,我从谷歌那里得到了这个链接,并没有注意到它最初是用于gcc 2.95。 古!