gpt4 book ai didi

c - C 中的高级预处理器标记化

转载 作者:太空宇宙 更新时间:2023-11-04 03:05:34 24 4
gpt4 key购买 nike

我在为我的 PIC 构建 C 宏时遇到问题。其他基于 C 的系统也是如此,因此也非常欢迎非 PIC C 专家。

假设我已经定义了我的 LED_1 引脚:

#define LED_1 A1    //A1 as output for LED_1

所以如果我想点亮 LED,我会写:

PORTAbits.RA1 = 1;

如果我想使用我的 LED_1 定义来实现它,我必须再添加两个宏:

#define change_PORT_(var) PORTAbits.R##var
#define change_PORT(var) change_PORT_(var

并使用它:

change_PORT(LED_1) = 1;

它就像一个魅力。但问题是在上面的定义中我有

PORT A bits.##var

如果我想更改 PORTB 值怎么办?我将不得不为端口 A 和端口 B 构建单独的宏。但它甚至不是一个可靠的解决方案。我想出了一个想法,但我不知道为什么行不通。

#define LED_1 A1
#define LED_2 B1

#define __A1 A //This would be defined for all PORTA's pins such as A2,A3,A4 etc
#define __B1 B

#define ___change_PORT(var,var2) PORT##var2 bits.R##var
#define __change_PORT(var,var2) ___change_PORT(var,var2)
#define _change_PORT(var) __change_PORT(var,__##var) // creating e.g. __A1
#define change_PORT(var) _change_PORT(var)

当我尝试运行它时:

change_PORT(LED_1);

编译器将 __##var 更改为 ___A1 但它永远不会将 __A1 更改为 A 所以这个 MACRO无法正常工作。

我花了很多时间试图修复它,所以我很感激任何帮助:)


EDIT::


我可能已经找到了解决问题的方法:
(LAT 只是另一个寄存器名称,但它的作用与 PORT 相同,因此此名称更改无关紧要)

#define ___PORTchange(var,var2) PORT##var2##bits.R##var
#define __PORTchange(var,var2) ___PORTchange(var,var2)
#define CHANGE_TO_PORT_NAME(var) ___##var
#define _PORTchange(var) __PORTchange(var,CHANGE_TO_PORT_NAME(var))
#define PORTchange(var) _PORTchange(var)

但是我得到一个编译器错误:

100: PORTAbits.RA0 = 1;
^ (374) missing basic type; int assumed (warning)
^ (983) storage class redeclared
^ (984) type redeclared
^ (239) identifier "PORTAbits" redefined (from line 3900)
^ (314) ";" expected

所以不,它确实正确地替换了它,但我收到一个编译器警告,告诉我我重新定义了我无法理解的 PORTAbits。我只是想让预处理器将 PORTchange(var) 更改为 PORTxbits.Rvar,其中 x 是 A 或 B。但似乎我正在重新声明一些东西。

我不明白。

最佳答案

如果我预处理(尝试使用多个 gcc 版本和 sun cc)

#define LED_1 A1
#define LED_2 B1

#define __A1 AX
#define __B1 BX

#define ___change_PORT(var,var2) PORT##var2##bits.R##var
#define __change_PORT(var,var2) ___change_PORT(var,var2)
#define _change_PORT(var) __change_PORT(var,__##var)
#define change_PORT(var) _change_PORT(var)

change_PORT(LED_1);
change_PORT(LED_2);

我明白了

PORTAXbits.RA1;
PORTBXbits.RB1;

这显然是你想要的。编译器中的错误?

关于c - C 中的高级预处理器标记化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5687976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com