【发布时间】: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