不使用 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);
else
MY_MACRO(b);
那宏展开后就是
if (a)
{
printf("Hello ");
printf("%d", x);
};
else
MY_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);
else
do
{
printf("Hello ");
printf("%d", x);
} while (0);
文章讨论了在C语言中如何正确使用宏避免在if-else语句中产生错误的展开。通过引入dowhile(0)结构,可以确保宏在条件语句中的正确行为,防止语法错误。示例展示了如何定义和使用带dowhile(0)的宏来实现代码块的行为。
2438

被折叠的 条评论
为什么被折叠?



