不使用 do while(0)
#define MY_MACRO(x) \printf("Hello "); \printf("%d", x);
如果有 if 判断代码
if (x)MY_MACRO(x)
那么宏展开后就是
if (x)printf("Hello ");printf("%d", x);
第二个语句并没有在 if 成立时执行
上述问题可以用 {}
解决
#define MY_MACRO(x) { \printf("Hello "); \printf("%d", x); \}
if (a)MY_MACRO(a);
elseMY_MACRO(b);
那宏展开后就是
if (a){printf("Hello ");printf("%d", x);};
elseMY_MACRO(b);
在if-else 语句中 };
这种结构是会报错的
使用 do while(0) 结构
#define MY_MACRO(x) do { \printf("Hello "); \printf("%d", x); \
} while(0)
完美解决上述问题
if (a)do{printf("Hello ");printf("%d", x);} while (0);
elsedo{printf("Hello ");printf("%d", x);} while (0);