呵呵~~原来这样...
不过关于第1点
举个例——
#define DHD_ERROR(args) do {if (1) printf args;} while (0)
那么,和下面的语句比起来又有何不同呢?
#define DHD_ERROR(args) do {printf args;} while (0)
宏不管怎么释都只是替换而已
"#define DHD_ERROR(args) do {printf args;} while (0)"
这本质是还个带参数的宏定义,好处就是什么样的参数都合法,这是针对编译器而言的(对参数宏本身都是合法的),
也就是说不管是简单的参数(比如常量),还是复杂的表达式都可以,特别适合参数又是个宏定义的情况,甚至参数是多重宏定义的情况
可能一般还是很难理解的,最好是查看源文件中的调用情况分析
while (0)好理解了,就是只执行一次do的语句,本质就是C语句
To jqlilee: #define DHD_ERROR(args) do {printf args;} while (0)比
#define DHD_ERROR(args) {printf args;}的好处么...
比如有如下调用:
if(a == b)
DHD_ERROR(args);
else
Func();
同时用上面两者展开,前者是——
if(a == b)
do {printf args;} while (0);
else
Func();
当然运行正确,但如果如下展开,红色分号注意到没?这时候else找谁去?
if(a == b)
{printf args;};
else
Func();
To butlet:
这和汇编没有关系,这年头没有哪个编译器会傻到if(1),do{}while(0)都会视若无睹,“写得更纯粹”,那编译出来结果仍旧完全一样,同时可读性直线下降,有弊无利。
To heuyck:
可能就是这个原因了,用if(1)和(0)来调试不同代码,不过#if 0和#if 1岂不是更好...呵呵
另外具体调用方式举个例——
DHD_ERROR(("The Value is %d", x));
给我的感觉是为了兼容不支持C99的老编译器而这么做的,展开后自然就变成
do {if(1)printf ("The Value is %d", x);} while (0);
当然GNU的C用多了就发现...写这OS的人也挺无奈的