在宏中使用({...})括号来吞下分号

Joh*_*lvr 6 c macros

通常,在宏中,您会看到人们使用a do { ... } while(0)来吞下分号.我刚刚遇到了一个他们使用的例子({ ... }),它似乎不仅吞下了分号,而且似乎也允许你返回一个值:

#define NEW_MACRO()  ({ int x = 1; int y = 2; x+y; })

 if(1) 
   val = NEW_MACRO(); 
 else 
   printf("this never prints");`
Run Code Online (Sandbox Code Playgroud)

val会出来3.我找不到任何关于它的文档,所以我对它有点警惕.这种方法有什么问题吗?

Oli*_*rth 10

这在标准C中无效.

有些编译器可能有扩展(例如GCC的语句表达式),允许这类事情.