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