c++ - 解决#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;
但即使这是不可能的,因为它们是位域)
还有其他解决方案吗?
解决方案
还有其他解决方案吗?
不。
而不是放在_
成员变量名称的末尾(正如您所说的truly horrible
,我想指出的是,它真的很好并且可以),您可以在变量的前面或末尾放置其他内容。
您也可以#undef
使用宏。
您还可以在定义宏之前定义结构。
总体而言,所有解决方案都很麻烦,最好的办法是在任何地方都使用唯一的名称。为您的结构成员选择不同的名称 - 例如,_
在末尾加上。
推荐阅读
- azure - 减少从 UWP 应用发送的遥测流量
- python - 解析子进程标准输出值
- python-3.x - 在 pyspark 中读取太多小文件需要花费大量时间
- vue.js - buefy 轮播中的模板插槽显示损坏的图像
- mongodb - 通过 Monk 连接到 Mongo DB atlas
- django - Django如何在序列化程序中获取外键的名称?
- python - 合并已按列分组的不同数据框
- javascript - 如果该数组存在于所选数据上,如何过滤数组?
- sql-server - Datediff 问题(自每位患者上次预约以来的天数和 2019 年 9 月 23 日)
- r - R:具有多层次组织的 ICC(心理)功能