在许多C/C++宏中,我看到宏的代码包含在看似无意义的do while循环中.这是一些例子.
#define FOO(X) do { f(X); g(X); } while (0)
#define FOO(X) if (1) { f(X); g(X); } else
Run Code Online (Sandbox Code Playgroud)
我看不出它do while在做什么.为什么不在没有它的情况下写这个?
#define FOO(X) f(X); g(X)
Run Code Online (Sandbox Code Playgroud) 在C中的位置MIN和MAX定义,如果有的话?
实现这些的最佳方式是什么,尽可能通用和安全?(首选编译器扩展/内置主流编译器.)
通常,在宏中,您会看到人们使用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.我找不到任何关于它的文档,所以我对它有点警惕.这种方法有什么问题吗?