测试结构是否有成员名称

时间:2013-08-18 09:36:21

标签: c

我在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这没关系?

提前致谢,

1 个答案:

答案 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变量添加定义。