个人知识库 个人知识库
首页
关于
  • C语言
  • CPlusPlus
  • Linux
  • PHP
  • Nginx
  • MySQL
  • Redis
  • Docker
  • Kubernetes
  • SRS
阅读
常用工具
  • 分类
  • 标签
  • 归档
GitHub

Agnes001

坚持是一件很伟大的事业
首页
关于
  • C语言
  • CPlusPlus
  • Linux
  • PHP
  • Nginx
  • MySQL
  • Redis
  • Docker
  • Kubernetes
  • SRS
阅读
常用工具
  • 分类
  • 标签
  • 归档
GitHub
  • C语言

  • CPlusPlus

    • 基础特性

      • 枚举
        • C语言枚举
        • C++枚举
          • 简述
          • 强类型枚举
          • 项目中的强类型枚举代码片段
      • 字符指针
    • vs2019设置
    • C++11特性

    • 并发编程

    • 引用
    • 类和对象
    • 友元和运算符重载
    • 继承
    • 继承和多态
    • 模板
    • C++基础总结
    • 类型转换
    • 异常
    • 容器
    • 算法
    • C++程序设计
    • C++ Primer总结
    • 编程技巧
    • 标准库体系结构与内核分析
    • 设计模式
    • cmake配置C++工程
    • libcurl的使用总结
    • web开发框架--drogon
    • log4cplus使用
    • C++数据类型
    • 函数
    • 线程
    • 进程
    • 文件操作
    • 日常问题记录
    • Cpp案例程序
    • 多线程
    • 侯捷c++11新特性
    • 侯捷stl
  • Lua技术栈

  • edoyun

  • 内存管理

  • 数据结构

  • 网络编程

  • Linux

  • 池化技术

  • 操作系统

  • python

  • 编程技术
  • CPlusPlus
Agnes001
2022-06-22

C/C++枚举

# C语言枚举

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };

  1. 枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。
  2. Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。
  3. 枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。
  4. 意味着,Mon、Tues、Wed 等都不是变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用&取得它们的地址。这就是枚举的本质。

枚举类型变量需要存放的是一个整数,下面来验证一下:

#include <stdio.h>
int main(){
    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day = Mon;
    printf("%d, %d, %d, %d, %d\n", sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed), sizeof(int) );
    return 0;
}

运行结果: 4, 4, 4, 4, 4

# C++枚举

# 简述

强类型枚举(Strongly-typed enums),号称枚举类型,是C++11中的新语法,用以解决传统C++枚举类型存在的缺陷。 传统C++中枚举常量被暴漏在外层作用域中,这样若是同一作用域下有两个不同的枚举类型,但含有相同的枚举常量也是不可的,比如: enum Side{Right,Left}; enum Thing{Wrong,Right}; 这是不能一起用的。 另外一个缺陷是传统枚举值总是被隐式转换为整形,用户无法自定义类型。C++11中的强类型枚举解决了这些问题。

# 强类型枚举

强类型枚举使用enum class语法来声明,如下:

enum class Enumeration{
 VAL1,
 VAL2,
 VAL3=100,
 VAL4
};

这样,枚举类型是安全的,枚举值也不会被隐式转换为整数,无法和整数数值比较,比如(Enumeration::VAL4==10会触发编译错误)。 另外枚举类型所使用的类型默认为int类型,也可指定其他类型,比如:

enum calss Enum:unsigned int{VAL1,VAL2};

正如前面所说,强类型枚举能解决传统枚举不同枚举类下同枚举值名的问题,使用枚举类型的枚举名时,必须指明所属范围,比如:Enum::VAL1,而单独的VAL1则不再具有意义。 还有一点值得说明的是C++11中枚举类型的前置声明也是可行的,比如:

enum class Enum;
enum class Enum:unsigned int;

# 项目中的强类型枚举代码片段

  1. 图像处理 enum class Color{RED,BLUE,YELLOR,BLACK,WHITE};
  2. 交通灯 enum class TrafficLight{RED,YELLOR,GREEN}; 强类型枚举值具有传统枚举的功能——命名枚举值,同时又具有类的特点——具有类域的成员和无法进行默认的类型转换。所以也称之为枚举类——enmu class 枚举类的底层数据必须是有符号或无符号整型,比如char unsigned int unsigned long,默认为int。
  3. 前置声明应用
enmu class Color:char;  //前置声明枚举类
void Foo(Color*p);        //前置声明的使用
//....................
enum class Color:char{RED,GREEN,BLACK,WHITE};                       //前置声明的定义
编辑此页
C语言总结
字符指针

← C语言总结 字符指针 →

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式