整体如下;
(1)整体理解
整体的结构是ifdef else endif
也就是如果定义了N0_DECLTYPE 就执行else上面的部分,否则就执行else下面的代码部分。
NO_DECLTYPE字面来看就是说如果没有定义DECLTYPE,所以这段代码也就是说:
如果没定义DECLTYPE,那么,就执行64-69行之间的代码,否则,就执行71-74行之间的代码。
(2)第一个define只是用来说明宏定义是否已经定义,但是宏定义具体代表了什么功能和含义对程序员来说没有影响,所以就忽略了后面的内容,
第一个define只是用来判定N0_DECLTYPE这个宏定义是否已经在别的地方定义过,用来避免重复的编译和嵌套调用
(3)73行的dst加括号,是因为,dst可能是一个表达式,用(dst)是把整个dst作为一个整体,因为宏定义实际上就是代码的替换,举个例子,
#define SUB(A,B) A*B
SUB(2+3,4+5)
这个表达式的结果是2+3*4+5 = 19,并不是想要的5*9=45,如果要达到想要的结果,宏定义就要定义为
#define SUB(A,B) (A)*(B)
这就是73的dst为什么要用()的原因
(4) \ 是连接符,表示后面的代码跟当前行是一个整体,再宏定义的代码比较长时,用 \ 来表示后面代码是整个宏定义的一部分,方便查看代码逻辑和书写
(5)66和72行的do while循环只执行一次,因为while的条件是0。
再没有定义DECLTYPE时,执行第66行的循环,如果定义了DECLTYPE则执行72行的循环,72行的循环比较简单,就是调用已经定义的DECLTYPE宏定义。
第66行的循环,_da_dst 指向了dst的地址,*_da_dst=(char*)(src)则把src的值赋值给了_da_dst指向的内存,也就是把src的值赋值给了dst,从而实现复制功能