2、第一个define后面什么都没跟是什么意思 一般define不是像 #define PI 3.14 这种后面会放一个东西跟着的吗(如例子里PI后面跟着3.14)
3、73行等号左右两边的dst为什么要加括号?不加会怎么样?还是说这是什么书写标准吗?
4、65 66 67等行的末尾有一个 \ 符号,这个符号是什么意思,有什么作用。
5、66和72行的两个do while具体实现了什么功能,大致讲解一下怎么实现的。
整体如下;
(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,从而实现复制功能
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!类似类型转换,待转换的类型需要用括号包裹,类似68行转为char *