cnxh 发表于 2022-1-2 13:53:19

#define替换,已定义的常量不能更改为数字

本帖最后由 cnxh 于 2022-1-2 13:55 编辑

下面DmaSelect 为1时,DmaChannel和DmaIRQn都选择Dma1, DmaSelect 为2时,   DmaChannel和DmaIRQn都选择Dma2      
#define DmaSelect             1                   //选择adc,dma通道
//
#define DmaChannel            DMA1_Channel1         //选择adc,dma通道
#define DmaIRQn           DMA1_Channel1_IRQn      //dma中断源
//
现在想只要更改DmaSelect一处,其它的 DmaChannel和DmaIRQn预处理自动改变,下面的编译错误DmaSelect不会替换为数字,而是宏名DMADmaSelect_Channel

#define DmaChannel            DMA##DmaSelect##__Channel1      //选择adc,dma通道,编译错误
#define DmaIRQn           DMA##DmaSelect##__Channel1_IRQn      //dma中断源,编译错误

t3486784401 发表于 2022-1-2 15:04:56

C 宏的连字符 ## 只能连接带参数的宏,你这常量宏连不上。

想要实现“改一处数字,其他宏内部数字跟着改”,在这里需要两层宏来搞定,一层展开名称、一层展开编号:

#define DMA(c)          DMA_##c(3)
#define DMA_CHN(x)      DMA##x##_Channel1
#define DMA_IRQ(x)      DMA##x##_Channel1_IRQn

#define DmaChannel      DMA(CHN)
#define DmaIRQn         DMA(IRQ)

这时候第一行末尾的 (3) 就指定了是 DMA3,改其他数字最终 DMAx 跟着变。
想要再往里用常数替代掉,C 宏已经做不到

cnxh 发表于 2022-1-2 19:18:50

谢谢,试试看

cnxh 发表于 2022-1-3 09:07:39

谢谢,试过可以,但是想了好久,还是想不明白为什么展开后是这样,那如果Channel也自动改变呢如
选择dma1的Channel1,DmaChannel自动为DMA1_Channel1,
选择dma2的Channel2,DmaChannel自动为DMA2_Channel2,

cnxh 发表于 2022-1-3 09:15:41

DmaChannel      DMA(CHN) , 展开后就是 DmaChannel      DMA_##c(3), 其中c(3),就是DMA_CHN(x)的CHN(x),也就是DMA_CHN(x),就是DMA##x##_Channel1,然后带括号的宏定义数字展开,就是最后的DMA3_Channel1

cnxh 发表于 2022-1-3 09:22:09

本帖最后由 cnxh 于 2022-1-3 10:00 编辑

t3486784401 发表于 2022-1-2 15:04
C 宏的连字符 ## 只能连接带参数的宏,你这常量宏连不上。

想要实现“改一处数字,其他宏内部数字跟着改” ...
01.#define DMA(c)          DMA_##c(3)

02.#define DMA_CHN(x)      DMA##x##_Channel1

03.#define DMA_IRQ(x)      DMA##x##_Channel1_IRQn

05.#define DmaChannel      DMA(CHN)

06.#define DmaIRQn         DMA(IRQ)


DmaChannel      DMA(CHN) , 展开后就是,DmaChannel      DMA_##c(3), 其中c(3),就是,DMA_CHN(x)的CHN(x),也就是DMA_CHN(x),就是DMA##x##_Channel1,然后带括号的宏定义数字展开,就是最后的DMA3_Channel1



//自己试着改了下
#define DMA(n,c)          DMA_##n(2,1)//选择dm2,的通道1
#define DMA_CHN(x,y)      DMA##x##_Channel##y
#define DMA_IRQ(x,y)      DMA##x##_Channel##y##_IRQn
#define DmaChannel      DMA(CHN,Num)
#define DmaIRQn         DMA(IRQ,Num)
这样提示编译无错误,不知道运行对不对


//这样可以,自己选择dm3的通道2,片子没有dm3,编译后提示错误的展开语句是正确的


//回复帖子时间限制,只能在这里修改
那我这样对不对,错误提示的最终结果提示语句是和预想的一样

//自己仿真了一下,宏定义选择dma1的通道2,#define DmaChannel      DMA(CHN,Num)   和#define DmaChannelDMA1_Channel2,运行传送都一样,DmaChannel都是0x4002001C,应该正确的   

t3486784401 发表于 2022-1-3 09:42:27

cnxh 发表于 2022-1-3 09:22
01.#define DMA(c)          DMA_##c(3)

02.#define DMA_CHN(x)      DMA##x##_Channel1


最终的 Num 参数并没有用到啊,这也就是无错误的原因。如果用到了就会因为直接套入宏而出错:

第一行 DMA(n,c) 的时候,c 参数被抛弃了

cnxh 发表于 2022-1-4 05:37:27

本帖最后由 cnxh 于 2022-1-4 05:38 编辑

谢谢, 能这样定义已经方便了好多,不用切换选择dma时,全部dma设置都要更改一遍
#define DMA(n)          DMA_##n(4,5)            //选择dma和通道
#define DMA_CHN(x,y)      DMA##x##_Channel##y
#define DMA_IRQ(x,y)      DMA##x##_Channel##y##_IRQn
#define DmaChannel      DMA(CHN)
#define DmaIRQn            DMA(IRQ)
//这样就可以了

cnxh 发表于 2022-1-4 06:49:16

t3486784401 发表于 2022-1-3 09:42
最终的 Num 参数并没有用到啊,这也就是无错误的原因。如果用到了就会因为直接套入宏而出错:

第一行 DM ...

//可以了,使用另一个dma和通道改变下面的dma和通道
#define DmaSelect             5                   //选择adc,dma通道
#define DmaChannelNumber      3                   //选择adc,dma通道序号
//
#define DMA(n,d,c)          DMA_##n(d,c)            //选择dma和通道
#define DMA_CHN(x,y)      DMA##x##_Channel##y
#define DMA_IRQ(x,y)      DMA##x##_Channel##y##_IRQn
#define DmaChannel      DMA(CHN,DmaSelect,DmaChannelNumber)   //选择使用的dma和通道
#define DmaIRQn         DMA(IRQ,DmaSelect,DmaChannelNumber)   //选择使用dma通道中断源


cnxh 发表于 2022-1-7 04:58:42

t3486784401 发表于 2022-1-3 09:42
最终的 Num 参数并没有用到啊,这也就是无错误的原因。如果用到了就会因为直接套入宏而出错:

第一行 DM ...

兄弟,文件包含字符串,预定义可以连接吗,下面提示错误
#define name Stm32103fx

#define file(n) "Config_"#n"Link.h"
#includefile(name)

如最终想包含"Config_Stm32103fxLink.h",下次改变文件只修改一处name xxxxxx"Config_xxxxxxfxLink.h",

advarx21ic 发表于 2022-1-10 01:09:23

看不懂,又把define研究了一遍

cnxh 发表于 2022-1-10 21:28:10

advarx21ic 发表于 2022-1-10 01:09
看不懂,又把define研究了一遍

哪个看不懂

advarx21ic 发表于 2022-1-11 11:38:53

cnxh 发表于 2022-1-10 21:28
哪个看不懂

已经搞懂了,谢谢
页: [1]
查看完整版本: #define替换,已定义的常量不能更改为数字