C 预处理器的If条件存在问题

C 预处理器的If条件存在问题,c,c-preprocessor,avr,C,C Preprocessor,Avr,我为AVR XMega微控制器编写了引导加载程序,引导加载程序由配置文件配置: Config_Bootloader.h #ifndef CONFIG_BOOTLOADER_H_ #define CONFIG_BOOTLOADER_H_ #include <avr/io.h> #define BOOTLOADER_INTERFACE &USARTE0 #define BOOTLOADER_BAUD

我为AVR XMega微控制器编写了引导加载程序,引导加载程序由配置文件配置:

Config_Bootloader.h

#ifndef CONFIG_BOOTLOADER_H_ 
#define CONFIG_BOOTLOADER_H_ 

 #include <avr/io.h>

 #define BOOTLOADER_INTERFACE                   &USARTE0
 #define BOOTLOADER_BAUD                        115200
 #define BOOTLOADER_TX                          3       

#endif /* CONFIG_BOOTLOADER_H_ */
我得到了以下错误和警告:

> #define BOOTLOADER_INTERFACE                  &USARTE0

operator '&' has no left operand

> #if(BOOTLOADER_INTERFACE == &USARTE0)

in expansion of macro 'BOOTLOADER_INTERFACE'
#error "Invalid bootloader interface!"

那么为什么地址的比较不起作用呢?

预处理器中没有“地址”这样的东西,因此它们不能在
#if
预处理器指令中进行比较

有关它可以做什么和不能做什么的详细信息,请参阅。请参阅您正在使用的预处理器的文档,可能会应用其他/不同的限制(您将其标记为AVR)


似乎您的预处理器得出结论,运算符
&
必须是位运算符&,这是一个二进制运算符,因此需要一个左操作数。

好的,在与C预处理器进行了仔细研究之后,我有了一个解决方案。 我在配置中定义符号
BOOTLOADER\u INTERFACE=E,0
,并处理输入:

 #define CATENATE(Prefix, Name)             Prefix##Name
 #define FIRST_ARG(A, B)                    A
 #define SECOND_ARG(A, B)                   B

 #define MAKE_USART_NAME(Uart)              CATENATE(USART, Uart)
 #define MAKE_PORT_NAME(Port)               CATENATE(PORT, Port)
 #define USART_NAME(Name)                   MAKE_USART_NAME(CATENATE(Name))
 #define PORT_NAME(Name)                    MAKE_PORT_NAME(FIRST_ARG(Name))
结果是端口和USART结构的地址,具体取决于给定的USART接口

> #define BOOTLOADER_INTERFACE                  &USARTE0

operator '&' has no left operand

> #if(BOOTLOADER_INTERFACE == &USARTE0)

in expansion of macro 'BOOTLOADER_INTERFACE'
#error "Invalid bootloader interface!"
 #define CATENATE(Prefix, Name)             Prefix##Name
 #define FIRST_ARG(A, B)                    A
 #define SECOND_ARG(A, B)                   B

 #define MAKE_USART_NAME(Uart)              CATENATE(USART, Uart)
 #define MAKE_PORT_NAME(Port)               CATENATE(PORT, Port)
 #define USART_NAME(Name)                   MAKE_USART_NAME(CATENATE(Name))
 #define PORT_NAME(Name)                    MAKE_PORT_NAME(FIRST_ARG(Name))