2010-01-16 39 views
8

我注意到,有时,C宏被写成这样:有关`({});`在C中的更多信息?

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

一些实验后,我发现:

  1. ({});会编,却又无可奈何。 (如预期)
  2. 关闭;将导致语法错误。这样做的副作用是确保foo()在代码中看起来像一个函数。 (虽然,如果将分号关闭,那么错误对于诊断问题并不是很有用!)
  3. return ({});抱怨不会被忽略的空值,就像我试图使用void函数一样。

这是为了让开发人员在他们的宏中添加一个分号,还是有另一个目的?我试过谷歌,但它标点符号失败。有没有这个名字?

回答

8

这是一个名为statement expressions的GNU扩展。

在标准C中声明宏时,经常会看到do...while(0)循环用于类似的目的(即创建块范围)。声明表达式优于循环黑客,因为它可以返回一个值。如果你想在标准C中做类似的事情,你必须定义一个额外的函数,并且失去词法范围的便利。

2

()是一个表达式。 ({code; code;})是一个表达式中的复合语句。这是一个GNU C扩展。

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

编辑:哇,我从谷歌该链接并没有注意到它是GCC 2.95在第一。古!

+0

古代 - 但语法仍支持4.4.2。 – 2010-01-16 08:14:38

3

关于语句表达式(如果有一件很酷的事情)很酷的事情是最后一条语句是表达式的结果。

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

int i = 0; 
float pi = foo(i); 
相关问题