C 在#define和do{…}中使用({…}),而在(0);?

C 在#define和do{…}中使用({…}),而在(0);?,c,macros,C,Macros,使用前一种语法有什么缺点吗?它似乎比后者更干净、更清晰。({…}),正如BLUEPIXY所写,是一个GCC扩展,因此它的缺点是不能移植到不同的编译器,而语法do{…}while(0)是标准的。这是一个GCC扩展。可能重复:@JonnyHenly请参阅简单的答案:除非没有其他方法,否则不要使用宏。不要因为懒惰而使用它们。你将使用它们来编写你自己的语言。。。而版本的#define不应以分号结尾:分号将由宏的用法提供(如中的if(a!=b)MACROCALL(a,b);/*此处的分号*/)

使用前一种语法有什么缺点吗?它似乎比后者更干净、更清晰。

({…})
,正如BLUEPIXY所写,是一个GCC扩展,因此它的缺点是不能移植到不同的编译器,而语法
do{…}while(0)
是标准的。

这是一个GCC扩展。可能重复:@JonnyHenly请参阅简单的答案:除非没有其他方法,否则不要使用宏。不要因为懒惰而使用它们。你将使用它们来编写你自己的语言。。。而
版本的
#define
不应以分号结尾:分号将由宏的用法提供(如
中的if(a!=b)MACROCALL(a,b);/*此处的分号*/