1

我在 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 这没问题?

提前致谢,

4

1 回答 1

3

您无法测试 a 中是否存在特定位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在元数据顶部声明的静态变量添加定义。

于 2013-08-18T09:56:18.220 回答