C语言枚举和C++枚举的区别?enum class(C++11强类型枚举(Strongly-typed enums)强枚举 Scoped Enumerations)(C++98弱枚举类型)

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言枚举和C++枚举的区别?enum class(C++11强类型枚举(Strongly-typed enums)强枚举 Scoped Enumerations)(C++98弱枚举类型)相关的知识,希望对你有一定的参考价值。

参考文章1:C与C++中的enum有什么不同?

参考文章2:为什么要用枚举以及c++11强枚举与c++98弱枚举的区别★★★★★

在C++98枚举(弱枚举)中,枚举类型是不限定作用域的(unscoped enumeration),枚举中的成员可不加命名空间限定符随意使用,但是不限定作用域的做法总是充满危险的,就上例而言,我们无法保证在当前命名空间是否不存在与ImageResolution相对应的CameraResolution枚举类型,其同样包含有成员HIGH, HIGH_2K, HIGH_4K中的一个或多个,若真的包含,很可能在不知觉中被调用者混淆——更让人难过的是,调用者可能并没有料到如此。这种场景在使用第三方库的情况下更为严重。因为传统枚举总是默认可以被隐式地转化为int类型,在不知不觉中就进行了跨作用域的类型转换。

c++11的强枚举类型enum class或enum struct是安全的!

注意:c++11枚举体的声明和定义使用 enum class或是enum struct, 二者是等价的

文章目录

C语言和C++语言都提供了枚举类型,两者是有一定区别. 我们接下来通过代码进行演示:

1. C语言中 enum

main.c

#include <stdio.h>

int main()

	enum Week  Mon, Tue, Wed, Thi, Fri, Sat, Sun ;
	enum Other  One, Two, Three ;
	enum Week week = Mon;

	// 1. 允许非枚举值赋值给枚举类型, 允许其他枚举类型的值赋值给当前枚举类型	
	week = 100; //ok	
	week = One; //ok

	// 2. 枚举值具有外层作用域,容易造成名字冲突	
	//int One = 100; //error	//错误	C2365	“One” : 重定义;以前的定义是“枚举数”

	// 3. 不同类型的枚举值可以直接比较
	if (week == One)
	
		printf("equal\\n");	//equal
	

	return 0;

其中第二种情况错误提示如下:

2. C++中 enum

main.cpp

#include <iostream>
using namespace std;

int main()

	enum Week  Mon, Tue, Wed, Thi, Fri, Sat, Sun ;
	enum Other  One, Two, Three ;
	enum Week week = Mon;	//警告	C26812	枚举类型“main::__l2::Week”未设定范围。相比于 "enum",首选 "enum class" (Enum.3)。


	// 1. C++ 只能允许赋值枚举值	
	// week = 100; //error
	// week = One; //error	

	// 2. 枚举元素会暴露在外部作用域,不同的两个枚举类型,若含有相同枚举元素,则会冲突
	//enum OtherWeek  Mon ;	//error,重定义,以前的定义是枚举数

	// 3. C++ 只允许同枚举类型值之间比较(作者说得貌似不对,能够比较!)
	enum E1  A, B ;
	enum E2  C, D ;
	cout << (E1::B == E2::D ? "相等" : "不相等") << endl; //相等

	return 0;

3. C++中的 enum class(强枚举类型)(强枚举类型禁止不同枚举类型之间进行比较)

#include <iostream>
using namespace std;

int main()

	enum class E1  A = 1, B = 2 ;
	enum class E2  A = 1, C = 2 ;

	// 1. 强枚举类型不会将枚举元素暴露在外部作用域
	cout << (int)(E1::A) << endl;	//1
	int A = 100;

	// 2. 不相关的两个枚举类型不能直接比较,编译报错
	//cout << (E1::B == E2::C ? "相等" : "不相等") << endl; //error	//E0349	没有与这些操作数匹配的 "==" 运算符
	//cout << (E1::B == 2 ? "相等" : "不相等") << endl; //error	E0349	没有与这些操作数匹配的 "==" 运算符

	return 0;

总结

  1. C 枚举类型支持不同类型枚举值之间赋值、以及数字赋值、比较,并且具有外层作用域。

  2. C++ 中枚举不允许不同类型的值给枚举类型变量赋值,但仍然支持不同类型之间枚举进行比较,枚举符号常量具有外层作用域。

  3. C++ 强枚举类型不允许不同类型之间的赋值、比较,枚举常量值并不具有外层作用域。

以上是关于C语言枚举和C++枚举的区别?enum class(C++11强类型枚举(Strongly-typed enums)强枚举 Scoped Enumerations)(C++98弱枚举类型)的主要内容,如果未能解决你的问题,请参考以下文章

C语言枚举和C++枚举的区别?enum class(C++11强类型枚举(Strongly-typed enums)强枚举 Scoped Enumerations)(C++98弱枚举类型)

C#如何将枚举类(enum)型转换成字符(string)类型

C语言和C++语言之enum的用法和注意事项(枚举类型)

枚举类型 typedef enum....; enum....; 这两个的区别

c语言枚举类型enum用法

Android中是否推荐使用枚举Enum