关于`({});`的更多信息?

时间:2010-01-16 02:03:56

标签: c gcc macros

我注意到有时候,C宏写得像这样:

#define foo(bar) ({ ++bar; })

经过一些实验,我发现:

  1. ({});将编译但不执行任何操作。 (正如预期的那样。)
  2. 关闭;会导致语法错误。这样做的副作用是确保foo()看起来像代码中的函数。 (虽然,如果你关闭分号,错误对于诊断问题不是很有用!)
  3. return ({});抱怨虚假值不被忽略,就像我试图使用void函数一样。
  4. 这只是为了让开发人员在他们的宏中添加分号,还是有另一个目的?我已经尝试过谷歌,但是标点符号失败了。这有名字吗?

3 个答案:

答案 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扩展。

http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html

编辑:哇,我从谷歌那里得到了这个链接,并没有注意到它最初是用于gcc 2.95。古!