形式# definedo {的含义.} while (0)(转载)
# #定义.}while(0 (0),一种奇怪的宏定义形式,在实际项目中经常使用,其意义如下:
1. 增加代码的适应性
以下宏定义不使用do{.}while(0 (0)
#定义FOO(x)FOO(x);bar(x);
有了这个宏定义,单独调用就不会有问题了,例如:
FOO(100)
宏扩展为:
foo(x);bar(x);
这样调用FOO没有问题,但是FOO(x)不能放入控制语句中,例如:
如果(条件)
FOO(x);
其他
.
在宏观扩张之后,它变成了
如果(条件)
foo(x);bar(x);
其他
.
这就导致了语法错误,这个语法错误并不可怕,它可以在编译阶段被发现,甚至更致命的是,它可能导致逻辑错误,的哪个编译器都找不到。当这个问题出现时,程序员会发疯。示例:
如果(条件)
FOO(x);
该代码已扩展为:
如果(条件)
foo(x);bar(x);
这样,无论条件是真还是假,bar(x)都会被调用。你遭受过这个兄弟的折磨吗?
这时,do的值{.}而(0)被反射。修改FOO的定义。
# define FOO(x)do { FOO(x);bar(x);} while (0)
这样,可以毫无问题地将FOO放入控制语句中。
也许有人说:放foo(x);Bar(x)你不能用大括号把它括起来吗?例如,这样定义它:
#定义FOO(x){ FOO(x);bar(x);}
请看下面的代码:
如果(条件)
FOO(x);
其他
.
膨胀后:
如果(条件)
{ foo(x);bar(x);} ;//注意最后一个分号。语法错误。
其他
.
语法错误是一样的;
2.增加代码的扩展性
我理解可扩展性主要是因为在宏定义中可以引用其他宏,例如:
# define FOO(x)do { OTHER _ FOO(x)} while(0)
这样我们就不用担心OTHER_FOO是不是,但是语句还是符合语句的,不会有问题。
3.增加代码的灵活性
灵活性主要体现在我们可以从宏观上进行突破,比如以下定义:
#定义FOO(x) do{ \
foo(x);\
if(条件(x)) \
打破;\
条形(x) \
.\} while(0)
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/124349.html