C++枚举类型同名冲突问题

晶圆测试厂wafer map管理建议 按照Recipe设定bin定义 应有版本管理概念,一般使用最新版本做为活动版本即可 Bin明细中应包含 BinID、BinCode、BinName、BinType、BinColor、Description BinID可使用数字类型 BinCode可参照实际机台的Bin,用于匹配 有些公司也将BinID、BinCode理解为SBin和HBin 即 Software Bin & Hardware Bin 一般也将BinID对应到客户的Bin BinType 阅读详情

C++枚举类型同名冲突问题

今天被C++枚举类型困扰了……之前写程序一直没有留意到这个问题,原来在C++中使用多个枚举类型时也是不能出现同名的。DAMN IT!

个人认为这一点C++的实现确实是不如C#中那样的枚举类型先进……当然这里面是有一定的历史原因的,要兼容C嘛。但愿C++的下一个版本中会进行改进(已经有这个兆头了:-))

一时还真没有发现什么好的解决方案。只能是在枚举类型的前面多加前缀了。网上倒是找到了几种方案,不过我觉得都有一定的缺陷:

1.使用namespace。

如:namespace abc{enum exp{a,b,};}

不过我觉得在一个程序里面写的到处都是namespace无疑是一件非常尴尬的事,而且总有直觉认为在大型项目程序开发中会出现意想不到的错误……

2.定义一个宏来完成一定的功能。(以下内容为COPY)

C++ 中的枚举类型继承于 C 语言。就像其他从 C 语言继承过来的很多特性一样,C++ 枚举也有缺点,这其中最显著的莫过于作用域问题——在枚举类型中定义的常量,属于定义枚举的作用域,而不属于这个枚举类型。例如下面的示例:

enum FileAccess {
Read = 0x1,
Write = 0x2,
};

FileAccess access = ::Read; // 正确
FileAccess access = FileAccess::Read; // 错误

C++枚举的这个特点对于习惯面向对象和作用域概念的人来说是不可接受的。首先,FileAccess::Read 显然更加符合程序员的直觉,因为上面的枚举定义理应等价于如下的定义(实际上,.NET 中的枚举类型便是如此实现的):

class FileAccess {
static const int Read = 0x1;
static const int Write = 0x2;
};

其次,这导致我们无法在同一个作用域中定义两个同样名称的枚举值。也就是说,以下的代码是编译错误:

enum FileAccess {
Read = 0x1,
Write = 0x2,
};

enum FileShare {
Read = 0x1, // 重定义
Write = 0x2, // 重定义
};

如果这一点没有让你恼怒过的话,你可能还没写过多少 C++ 代码 :-)。实际上,在最新的 C++0x 标准草案中有关于枚举作用域问题的提案,但最终的解决方案会是怎样的就无法未卜先知了,毕竟对于象 C++ 这样使用广泛的语言来说,任何特性的增删和修改都必须十分小心谨慎。

当然,我们可以使用一些迂回的方法来解决这个问题(C++ 总是能给我们很多惊喜和意外)。例如,我们可以把枚举值放在一个结构里,并使用运算符重载来逼近枚举的特性:

struct FileAccess {
enum __Enum {
Read = 0x1,
Write = 0x2
};
__Enum _value; // 枚举值

FileAccess(int value = 0) : _value((__Enum)value) {}
FileAccess& operator=(int value) {
this->_value = (__Enum)value;
return *this;
}
operator int() const {
return this->_value;
}
};

我们现在可以按照希望的方式使用这个枚举类型:

FileAccess access = FileAccess::Read;

并且,因为我们提供了到 int 类型的转换运算符,因此在需要 int 的地方都可以使用它,例如 switch 语句:

switch (access) {
case FileAccess::Read:
break;
case FileAccess::Write:
break;
}

当然我们不愿意每次都手工编写这样的结构。通过使用宏,我们可以很容易做到这一点:

#define DECLARE_ENUM(E) \
struct E \
{ \
public: \
E(int value = 0) : _value((__Enum)value) { \
} \
E& operator=(int value) { \
this->_value = (__Enum)value; \
return *this; \
} \
operator int() const { \
return this->_value; \
} \
\
enum __Enum {

#define END_ENUM() \
}; \
\
private: \
__Enum _value; \
};

我们现在可以按如下的方式定义前面的枚举,并且不比直接写 enum 复杂多少。

DECLARE_ENUM(FileAccess)
Read = 0x1,
Write = 0x2,
END_ENUM()

DECLARE_ENUM(FileShare)
Read = 0x1,
Write = 0x2,
END_ENUM()
我觉得这种方法还好一些,不过看起来总是怪怪的,不符合标准C++的风格……只为了实现一个枚举的功能,还要搞出这样的宏来,还不如直接加前后缀简捷直观……

算了,老实定义不同名的枚举类型吧,要是有更好的解决方案,请留言……

基于MCP协议的AssistAI:深度集成Eclipse的AI编程助手实战指南 在AI辅助编程领域,大型语言模型(LLM)与开发工具的深度集成是提升开发效率的关键。其核心原理在于通过标准化的协议(如MCP,Model Context Protocol),将IDE的功能封装为AI可调用的工具集,从而实现环境感知与操作同步。这项技术的价值在于打破了传统AI编程工具与开发者工作流的割裂,使AI能够以符合工程规范的方式直接操作项目,如进行代码重构、运行测试和交互式调试。其典型应用场景包括复杂代码导航、自动化测试生成与精准的增量编译。本文以Eclipse插件AssistAI为例,详细解析了如何通 阅读详情

相关推荐

408王道考研【数据结构】思维导图(章节详细可下载xmind文件)

由于图片太多,不一一放上来了,还有部分章节【查找、排序、B树B+树等】在百度网盘,可以关注我的公众号领取【完整的图片+xmind文件】,如想要获取xmind文件的同学可以关注我的个人公众号“小柒很爱喵”,回复“数据结构导图”,可获得以上导图原图和xmind文件(可修改导图内容、查看导图隐藏的笔记与备注,即上图带杠杠的地方是我进一步助于理解的解释)。 希望对你们...

weixin_41950078的博客 7985

C++中enum枚举类型成员重名问题的解决方法 - Enum枚举类型的类封装

C++中enum枚举类型成员重名问题的解决方法 - Enum枚举类型的类封装C++语言中,对于一个枚举类型(enum),其成员值在所属枚举类型的声明作用域内是不可重复的。这个继承自C语言的特性,使我在写程序时碰到有相同名称的枚举成员时,苦于寻找且方便易读的替代枚举名称。这在C++程序开发方面带来了许多的不方便,在涉及枚举类型时必须时刻关注与现有的枚举变量是否有重名,在一定程度上限制了命名的

东方未明 1万+

Unity 2D精灵点击交互实现:从BoxCollider 2D到Event Trigger的完整指南

本文提供了Unity 2D精灵点击交互的完整实现指南。通过详细拆解BoxCollider 2D与Event Trigger两大核心组件的协同工作原理,手把手教你为Sprite Renderer添加点击、悬停等事件响应。文章包含从基础配置到进阶优化、性能调试的实战步骤,帮助开发者高效实现游戏世界内的对象交互,是Unity 2D开发的实用教程。

ansible6ops的博客 301

枚举量冲突

两个枚举定义中的枚举量可能发生冲突。比如有两个枚举定义: enum egg {Small, Medium, Large, Jumbo}; enum t_shirt { Small, Medium, Large, XLarge}; 这将没有办法通过编译,因为egg Small和 t_shirt Small位于相同的作用域内,将发生冲突。为了避免这个问题,C++11提供了一种新枚举,其枚举量的作用域为类。这种枚举的声明类似于下面这样: enum class egg {Small, Medium, Large,

Samson的博客 1205

告别实车测试:手把手教你用Vector VT平台搭建OBC/DCDC的HIL测试台架

本文详细介绍了如何利用Vector VT平台搭建新能源汽车OBC/DCDC的HIL测试台架,涵盖硬件选型、模型部署到自动化测试的全流程。通过HIL仿真测试技术,工程师可以高效验证动力域关键部件,大幅缩短开发周期并降低成本,特别适合新能源汽车三电系统的开发验证。

weixin_42659194的博客 338

GEOPHYSICS 投稿避坑指南:从格式规范到双盲评审的实战解析

本文详细解析了GEOPHYSICS期刊投稿的全流程避坑指南,从格式规范、数据声明到双盲评审的实战策略。特别强调了数学公式排版、图表制作标准以及投稿系统的隐藏关卡,帮助作者避免常见错误,提升投稿成功率。

weixin_30606461的博客 236

枚举enum中的枚举元素与宏定义冲突错误及解决方法

问题描述及原因 c语言代码中,如果出现枚举元素与宏定义命名相同,则编译会出现错误,例如下述.h文件中,用 typedef 关键字为 枚举数据类型 enum{FALSE=0, TRUE=!FALSE} 起了一个新的名字 bool. typedef enum {FALSE = 0, TRUE = !FALSE} bool; typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus, BitStatus, BitAction; typedef en

选好坑 挖好坑 才会结出好的果子 1万+

QCC304x系列开发教程(实战篇)之5.2 QCC3040之提示音

earbud_init.c中,初始化table中UiPrompts_Init /*! \brief Table of initialisation functions */ static const init_table_entry_t appInitTable[] = { ......... {UiPrompts_Init, 0, NULL}, ......... } ui_prompts.c中是提示音音处理的主要逻辑和配置源文件 函数static void uiPro...

心跳包的博客 2392

C语言的枚举类型赋相同的值

C语言枚举类型可以赋值相同

花满楼的博客 5256

IEEE Journal of Biomedical and Health Informatics(JBHI)投稿经验分享

《IEEE Journal of Biomedical and Health Informatics投稿经验分享》详细记录了在影响因子6.7的中科院一区期刊JBHI的投稿历程(2025.1-5月,历时4个月)。文章重点分析:1)审稿特色:4位审稿人差异显著,领域专家意见专业但要求严苛;2)修改要点:需重视大修(补充实验/原理阐述),并注意将回复内容同步至正文;3)期刊特点:送审率高但审稿严格,常规投稿周期约4-5个月;4)实用建议:建议首次大修全力以赴,善用AI工具辅助写作,避免拖延。

LiRongLu_的博客 5073

YOLOv9改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计

实时检测器架构的轻量级设计GsConv。

Limiiiing的博客 1364

枚举成员名称冲突(重名)的终极解决方案 —— class枚举(enum)

先从一个问题说起 enum ENUM1 { normal, big, mid, small }; enum ENUM2 { normal, big, mid, small }; 如上,2种不同的枚举类型却包含了名称相同的成员,编译会产生报错:error: ‘normal’ conflicts with a previous declaration 实际的报错远比这要多,因为EN...

Renekton_bhk的博客 6167

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++枚举类型同名冲突问题

C++枚举类型同名冲突问题 今天被C++枚举类型困扰了……之前写程序一直没有留意到这个问题,原来在C++中使用多个枚举类型时也是不能出现同名的。DAMN IT! 个人认为这一点C++的实现确实是不如C#中那样的枚举类型先进……当然这里面是有一定的历史原因的,要兼容C嘛。但愿C++的下一个版本中会进行改进(已经有这个兆头了:-)) 一时还真没有发现什么好的解决方案。只能是在枚举类型的前面多加前缀了。...

sky527759的博客 3303

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C/C++ 知识点:枚举类型同名冲突问题

在C++编程中,枚举类型(enum)是一种非常有用的数据类型,它允许程序员定义一组命名的整型常量,使得代码更加清晰、易于维护。然而,随着项目规模的扩大和代码复杂度的增加,枚举类型之间的同名冲突问题可能会逐渐浮现出来。本文将深入探讨C++枚举类型同名冲突的原因、影响以及几种有效的解决方案。

个人技术博客 1623

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++ 拾遗补缺 namespace enum (int&)a

C++ (int&)a是什么意思其实,(int&)a就是*(int*)(&a)namespace写了两个命名空间,里面有同名的函数[root@linuxtmp]#catmain.cpp #include<iostream> namespacespace1 { voidfun(void) { std::cout<&...

weixin_34148508的博客 289

c++解决枚举类型不能重名的宏

#define ENUM_DECLARE(class_type, enum_type) \ public: \ enum_type value; \ operator enum_type(){return value;} \ class_type(){} \ class_type(int val){ value = (enum_type)val;} \ class_type

zddhub的专栏 2835

命名空间、域、同名隐藏

同名隐藏,在C++中,是指当一个类(或作用域)中存在与父类(或外部作用域)中同名的成员或变量时,内部的同名成员或变量会隐藏外部同名的成员或变量。如果存在两个或多个具有包含关系的作用域,外层作用域声明了一个标识符,而内层作用域也声明了同名标识符,那么外层作用域的标识符在内层作用域中将不可见,即被内层作用域的标识符所隐藏。如果派生类声明了一个和基类成员同名的新成员(无论是函数还是变量),那么基类中的同名成员在派生类的作用域内将被隐藏。这些标识符在函数内部是可见的,但在函数外部是不可见的。

w20010915的博客 495

C++中enum枚举类型成员重名问题的解决方法 - Enum枚举类型的类封装(转)

<br />C++语言中,对于一个枚举类型(enum),其成员值在所属枚举类型的声明作用域内是不可重复的。这个继承自C语言的特性,使我在写程序时碰到有相同名称的枚举成员时,苦于寻找且方便易读的替代枚举名称。<br />这在C++程序开发方面带来了许多的不方便,在涉及枚举类型时必须时刻关注与现有的枚举变量是否有重名,在一定程度上限制了命名的自主性,也会降低程序的可读性。而在Visual Basic 6和.net系列语言中,两个不同的Enum类型可以具有相同的成员,在使用时只需加上Enum类型名称。目前就是要在

hairetz的专栏 6060

C++ static函数跨编译单元同名问题解析与链接原理详解

在C++编程中,编译单元与链接属性是理解代码组织与构建过程的基础概念。编译单元指经过预处理的源文件,是编译器独立处理的基本单位。链接属性决定了符号(如函数、变量)在不同编译单元间的可见性,分为外部链接、内部链接和无链接三种。static关键字在文件作用域用于控制链接性,赋予函数或变量内部链接属性,使其仅在本编译单元内可见,这是实现代码封装、避免命名冲突的重要机制。从技术价值看,合理利用内部链接能减少全局符号污染,提高模块化程度,并避免意外的符号重定义错误。在工程实践中,这一特性常用于隐藏模块内部辅助函数,或

weixin_30335353的博客 282

C++和标准库速成(三)——枚举类型、结构体、条件语句和条件运算符

枚举类型、结构体、条件语句和条件运算符

qq_51180928的博客 1190

枚举类型enum和enum class的区别

本文对比了C++中传统enum和C++11引入的enum class的主要区别。传统enum成员直接暴露在作用域中,容易造成命名冲突,且支持宽松的隐式类型转换;而enum class采用作用域限定访问,避免命名冲突,并增强类型安全,不支持隐式转换,必须显式转换。文中还介绍了两种枚举类型在命名规范、Qt/QML使用等方面的差异,并指出enum class可以指定底层类型。通过代码示例清晰展示了两种枚举类型在定义和使用上的不同特点。

空名的博客——云深知处 1072

枚举类型的理解

其次,枚举变量的取值只能是其枚举子所代表的值(或兼容的整数值,传统枚举支持隐式赋值,强类型枚举需显式转换),若赋予其他值,会导致未定义行为。而强类型枚举的枚举子被限定在自身的作用域内,必须通过“枚举名::枚举子”的方式访问,有效避免了作用域污染。在C++编程中,除了基础数据类型(如int、float、char)外,枚举类型(Enumeration)是一种常用的用户自定义数据类型,它通过将一组离散的常量值赋予有意义的名称,让代码更具可读性、可维护性,同时能有效限制变量的取值范围,避免非法数据的传入。

2402_84929584的博客 397

C++面试基础系列-enum

使用enum关键字定义枚举类型,可以指定底层的整数类型(如int、unsigned int等),如果不指定,默认为`int。

wesigj的博客 3285

备战字节 C++ 一面:enum 和 enum class 的区别你必须掌握

备战字节 C++ 一面:enum 和 enum class 的区别你必须掌握

m0_73443478的博客 1153

C++作用域为类的常量、域内枚举(C++ primer,P371)

除了#define,有三种在类内声明常量的方式: const声明常量; 类内声明一个枚举; 指定底层实现(可以用short之类实现枚举); const声明常量 const声明的常量在每个对象中都会存放一个备份(这是其缺陷); c++11之前,const声明常量时不能初始化,因为类只是描述对象的形式,没有创建对象;此时给出初始化的值,将无法存放。所以需要用初始化列表进行初始化。 c++11之后,...

pix_csdn的博客 484

C++11新特性(81)-有作用域的enum(scoped enumeration)

枚举类型的困惑 从C语言过度到C++以后,枚举作为减少程序错误的手段之一被广泛地使用。但是同时也带来一个问题:枚举值的重复。假设我们有下面的三原色定义: 代码中同时也需要定义三基色: 二者同时定义之后,就会遇到一个问题:red和blue连个值都被重复定义。   传统的解决方法 修改枚举值的名称当然是一个方法,只是比较低级,我们就不讨论了。一般的做法是将枚举类型的定义放到不同的一...

面向对象思考 3198
上一篇: 进程内存分布
下一篇: C++匿名名字空间
eric_arrow
博客等级 码龄14年 65粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值