首页 > 解决方案 > 解决#define与结构成员的冲突

问题描述

在预先存在的代码中,我有一些 #define 指向如下位域:

#define OUT0 PORT1.DR.B1
#define OUT1 PORT1.DR.B4

我需要将具有此名称的结构添加到 cpp 文件中:

struct {
    unsigned char OUT0: 1;
    unsigned char OUT1: 1;
    unsigned char OUT2: 1;
    unsigned char OUT3: 1;
    unsigned char OUT4: 1;
    unsigned char OUT5: 1;
    unsigned char OUT6: 1;
    unsigned char OUT7: 1;
} expander;

显然编译器会向我发出错误信号,因为预处理器替换了扩展器结构中的 OUT0 和 OUT1。

我不能更改结构成员的名称,因为它们必须与它管理的产品的标签一致。

显而易见的解决方案是将成员的名称更改为:

struct {
    unsigned char OUT0_: 1;
    unsigned char OUT1_: 1;
    unsigned char OUT2_: 1;
    unsigned char OUT3_: 1;
    unsigned char OUT4_: 1;
    unsigned char OUT5_: 1;
    unsigned char OUT6_: 1;
    unsigned char OUT7_: 1;
} expander;

但最后这些 '_' 真的很可怕。

(如果 PORT1.DR.B1 和 PORT1.DR.B4 不是位域,我可以用 const 指针替换 #defines:

unsigned char * const OUT0 = &PORT1.DR.B1;
unsigned char * const OUT1 = &PORT1.DR.B4;

但即使这是不可能的,因为它们是位域)

还有其他解决方案吗?

标签: c++c-preprocessormemberconflict

解决方案


还有其他解决方案吗?

不。

而不是放在_成员变量名称的末尾(正如您所说的truly horrible,我想指出的是,它真的很好并且可以),您可以在变量的前面或末尾放置其他内容。

您也可以#undef使用宏。

您还可以在定义宏之前定义结构。

总体而言,所有解​​决方案都很麻烦,最好的办法是在任何地方都使用唯一的名称。为您的结构成员选择不同的名称 - 例如,_在末尾加上。


推荐阅读