康来个程 2022-11-12 21:47 采纳率: 85.7%
浏览 38
已结题

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具体实现了什么功能,大致讲解一下怎么实现的。

  • 写回答

3条回答 默认 最新

  • 关注

    整体如下;

    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,从而实现复制功能
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月21日
  • 已采纳回答 11月13日
  • 创建了问题 11月12日

悬赏问题

  • ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
  • ¥15 大智慧怎么编写一个选股程序
  • ¥100 python 调用 cgps 命令获取 实时位置信息
  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题