我在MCU头文件中定义了一个结构
typedef struct tagANSBBITS {
unsigned ANSB0:1;
unsigned ANSB1:1;
unsigned ANSB2:1;
unsigned ANSB3:1;
unsigned ANSB4:1;
unsigned :7;
unsigned ANSB12:1;
unsigned ANSB13:1;
unsigned ANSB14:1;
unsigned ANSB15:1;
} ANSBBITS;
仅定义了一些位,因为它们是在hw中实现的。 问题是我自己就像这样的宏
#define pinMode(pin) pin(_ANS_F)
#define _ANS_F(alpha,bit) (ANS ## alpha ## bits.ANS ## alpha ## bit)
并像这样使用
pinMode(RED_LED) = 0;
当结构中没有定义相应的ANSBx时,这显然会失败。在使用宏之前,我可以以某种方式测试ANSx的存在吗?或者说服gcc这没关系?
提前致谢,
答案 0 :(得分:3)
您无法测试struct
中是否存在特定位:如果编译器看到对未定义的字段的引用,即使没有代码路径到达该字段,它也会抱怨。但是,您可以添加自己的一些“元数据”,以使单个宏在所有上下文中都可用:
// This is your "metadata": it defines which fields your struct has
static extern unsigned int unused; // Access of undefined values redirects here
#define ANSB0 ANSBBITS.ANSB0 // ANSB0 and ANSB2 are defined
#define ANSB1 unused // ANSB1 is not defined
#define ANSB2 ANSBBITS.ANSB2
... // Do the remaining bits in the same way
现在你可以像这样重写你的“神奇”宏:
#define _ANS_F(alpha,bit) (ANS ## alpha ## bit)
为了编译,您需要为元数据顶部声明的静态unused
变量添加定义。