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弱枚举类型)相关的知识,希望对你有一定的参考价值。
参考文章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;
总结
-
C 枚举类型支持不同类型枚举值之间赋值、以及数字赋值、比较,并且具有外层作用域。
-
C++ 中枚举不允许不同类型的值给枚举类型变量赋值,但仍然支持不同类型之间枚举进行比较,枚举符号常量具有外层作用域。
-
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)类型