C语言宏定义之类的问题,有帮助必采纳

img


1、(decltype(x)) 为什么要有最外层的这个括号,意义是什么,不加会怎么样?

img


(首先我大概介绍一下我现在对这个宏的理解,为了在不同环境中使用decltype,他自己定义了DECLTYPE,并且从63行开始通过自己实现decltype的功能,decltype在C++中的功能与auto近似,此处具体是什么我不确定)

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这个宏定义是否已经在别的地方定义过,用来避免重复的编译和嵌套调用
(373行的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) \ 是连接符,表示后面的代码跟当前行是一个整体,再宏定义的代码比较长时,用 \ 来表示后面代码是整个宏定义的一部分,方便查看代码逻辑和书写

(56672行的do while循环只执行一次,因为while的条件是0。
再没有定义DECLTYPE时,执行第66行的循环,如果定义了DECLTYPE则执行72行的循环,72行的循环比较简单,就是调用已经定义的DECLTYPE宏定义。
第66行的循环,_da_dst 指向了dst的地址,*_da_dst=(char*)(src)则把src的值赋值给了_da_dst指向的内存,也就是把src的值赋值给了dst,从而实现复制功能

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

类似类型转换,待转换的类型需要用括号包裹,类似68行转为char *