本文主要是介绍为什么一些宏不用{}而用do{}while(0),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
自从工作以来偶尔会在代码里见到一些do{}while(0)形式的宏定义,但是当初并不知道这样做的目的是什么,总觉得单单用一下{}就可以实现相同的功能了。
最近在看linux内核源码,里面有一堆do{}while(0)的宏,于是查了一下,发现有的情况只能用do{}while(0)的形式来定义宏,用单纯的{}会导致报错。
实验代码如下:
#include <stdio.h>#define MACRO_DO_WHILE_ZERO(enable, fmt, args...)do { if (enable) \printf(fmt, ##args); \} while(0)int main(int argc, char **argv)
{if(1)MACRO_DO_WHILE_ZERO(1, "%s\n", "true print");elseMACRO_DO_WHILE_ZERO(1, "%s\n", "false print");return 0;
}
在这种情况下,用do{}while(0)的宏可以编译通过。
#include <stdio.h>#define MACRO_BRACE_ONLY(enable, fmt, args...){ if (enable) \printf(fmt, ##args); \}int main(int argc, char **argv)
{if(1)MACRO_BRACE_ONLY(1, "%s\n", "true print");elseMACRO_BRACE_ONLY(1, "%s\n", "false print");return 0;
}
这种情况下编译会报错:
这篇关于为什么一些宏不用{}而用do{}while(0)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!