开发者

More information on `({});` in C?

开发者 https://www.devze.com 2022-12-16 19:14 出处:网络
I\'ve noticed that sometimes, C macros are written as something like this: #define foo(bar) ({ ++bar; })

I've noticed that sometimes, C macros are written as something like this:

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

After some experimentation, I've found that:

  1. ({}); will compile, but do nothing. (As expected.)
  2. Leaving the ; off will cause a syntax error. A side effect of this is ensuring that foo() looks like a function in your code. (Although, if you leave the semicolon off, the error isn't very useful for diagnosing the problem!)
  3. return ({}); complains about a void value not being ignored, just like if I had tried to use a void function.

Is this just to make de开发者_如何学编程velopers add a semicolon to their macros, or does it have another purpose? I've tried Google, but it fails miserably with punctuation. Is there a name for this?


This is a GNU extension called statement expressions.

When declaring macros in standard-C, you often see do...while(0) loops used for similar purposes (ie creating a block scope). A statement expression is superior to the loop hack because it can return a value. If you want to do something similar in standard-C, you'd have to define an additional function and lose the convenience of lexical scoping.


The cool thing about statement expressions (if there is a cool thing) is that the last statement is the result of the expression.

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

int i = 0;
float pi = foo(i);


() is an expression. ({code; code;}) is a compound statement inside an expression. That is a GNU C extension.

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

EDIT: wow, I got that link from Google and didn't notice it was for gcc 2.95 at first. Ancient!

0

精彩评论

暂无评论...
验证码 换一张
取 消