在项目中,用匿名结构体的地址作为常量来标识不同业务类型(例如 A 、B 、C 、D……),
这样做的目的是彻底避免魔术数字( magic number ),并且希望在逻辑判断中直接通过指针比较。
代码 h 文件
typedef struct __BizType *BizTypeRef; // 对外暴露的常量声明 extern const BizTypeRef kBizTypeA; extern const BizTypeRef kBizTypeB; extern const BizTypeRef kBizTypeC; extern const BizTypeRef kBizTypeD;
实现文件
// 定义结构体 struct __BizType { int value; }; // 定义常量指针 const BizTypeRef kBizTypeA = &(const struct __BizType){ .value = 1 }; const BizTypeRef kBizTypeB = &(const struct __BizType){ .value = 2 }; const BizTypeRef kBizTypeC = &(const struct __BizType){ .value = 3 }; const BizTypeRef kBizTypeD = &(const struct __BizType){ .value = 4 };
使用
// 使用示例 void handleBiz(BizTypeRef type) { if (type == kBizTypeA) { // 处理业务 A } else if (type == kBizTypeB) { // 处理业务 B } }
![]() | 1 r6cb 3 小时 46 分钟前 为什么不用枚举? |
2 liuidetmks OP @r6cb 枚举还是数字啊,还是能使用 1 当做参数传入。 我想完全只使用定义的这几个变量,政出一门 |
3 aprikyblue 2 小时 58 分钟前 ![]() 你看看 enum class |
4 cwxiaos 2 小时 46 分钟前 via iPhone 或许可以叫做更安全的枚举,限制下游代码乱搞 |
![]() | 5 minamo 2 小时 46 分钟前 via Android 如果你真这么讨厌魔数,倒也不是不行,但我觉得不值得 |
6 iOCZS 2 小时 37 分钟前 本该在语法层解决的问题,在用户侧试图解决,会引入复杂性 |
![]() | 7 ysc3839 2 小时 19 分钟前 via Android 这么写的话进行比较时可能并不是直接比较常量,而是要从全局变量里读取值,降低性能。 而且实现文件里这么取临时对象的地址,不怕编译器把这四个对象都优化成使用同一空间?不怕去到悬垂指针出现什么 UB ? 需要枚举类型的地方,能直接传递整数,是 C 允许隐式转换的问题,建议想办法调整编译参数,禁止这种行为,或者迁移到更严格的 C++。 |
![]() | 8 xuanbg 2 小时 3 分钟前 魔数有什么问题吗?其实魔数一点问题都没有,你先定义一个常量,无非就是脱裤子放屁多此一举 |
9 metalvest 1 小时 14 分钟前 为什么不直接用 std::type_index |
10 liuidetmks OP @metalvest c @ysc3839 全局作用域不会 ub 吧 比较的话是比较两个指针地址,性能不存在问题的 @xuanbg 有时候业务变化了,魔数可能哪里弄漏了,这里把结构体匿名,提供一个统一构造方法,方便处理一点。 @aprikyblue c |