【问题标题】:resove #define conflict with structure member解决 #define 与结构成员的冲突
【发布时间】:2021-04-14 10:35:37
【问题描述】:

在一个预先存在的代码中,我有一些 #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;

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

还有其他解决办法吗?

【问题讨论】:

  • 在文件范围内使用通用的短 4 字符标识符似乎是个坏主意。为什么不将 OUTx 宏重命名为更好的名称?我怀疑你在代码中使用了太多的 I/O 管脚名称,所以它不应该做太多的工作。
  • 假设结构仅在 1 个 cpp 文件中可见,您可以只在结构定义之前 #undef 宏吗​​?
  • 在这种情况下定义的长度不是问题,因为没有其他冲突。我知道重命名将是最简单的解决方案,但我不想更改#define 的名称或结构的成员。我想了解是否有其他解决方案。
  • [zkoza] 问题是#define OUT0 OUT1 和“expander”结构的成员在同一个函数中混合处理

标签: c++ c-preprocessor member conflict


【解决方案1】:

还有其他解决办法吗?

没有。

不要将_ 放在成员变量名称的末尾(正如您所说的是truly horrible,我想指出,它真的很好并且可以),您可以在前面或前面加上其他东西变量结束。

您也可以#undef 宏。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多