欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C和C++11之enum枚舉的具體使用方法

 更新時間:2020年12月09日 09:18:42   作者:李春港  
這篇文章主要介紹了C和C++11之enum枚舉的具體使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、前言

由于C++項目中用了相對比較多的枚舉(enum),正常情況下,枚舉變量都是占用一個整形類型的大小,但是項目中枚舉(enum)只需要使用到一個字節(jié)的大小,因為是在嵌入式設備上執(zhí)行的代碼,資源比較少,那么如果枚舉都是按照int型大小來使用的話,這無疑是一種資源浪費。

所以就想有沒有一種辦法可以控制枚舉(enum)占用內存的辦法。所幸,通過查找資料,發(fā)現(xiàn)C++11的新特性剛好加入了控制枚舉大小的機制。那么接下來我們就來看看,枚舉(enum)在C++11標準有哪些變化?以及C和C++11中的枚舉(enum)有什么區(qū)別?

二、C中的枚舉(enum)

2.1 C中枚舉的大小

前面有說到,默認情況下,枚舉enum的大小是一個整形類型的大小,但是整形類型有很多:int、long int、short int等,所以enum的大小還是不能確定的。在C中enum的大小是不可以通過程序員顯式控制的,這個大小是編譯器根據(jù)我們給枚舉(enum)賦值的大小來選擇合適的整數(shù)類型的。

下面舉個例子:

/*****************************************************************************
** Copyright © 2020 lcg. All rights reserved.
** File name: enum.c
** Description: 測試enum的特性
** Author: lcg
** Version: 1.0
** Date: 2020.12.08
*****************************************************************************/
 
#include <stdio.h>
 
enum color1
{
  RED = 0,
  GREEN,
  BLUE
};
 
enum color2
{
  GRAY = 0x1122334455,
  YELLOW,
  PURPLE
};
 
int main(int argc, char *argv[])
{
  printf("enum color1: %d\n", sizeof(enum color1));
  printf("enum color2: %d\n", sizeof(enum color2));
  return 0;
}

輸出結果:

enum color1: 4
enum color2: 8

我們發(fā)現(xiàn)這兩個枚舉變量所占用的大小是不一樣的,enum color2已經超過了4個字節(jié),所以編譯器會根據(jù)實際值的大小來調整枚舉變量的大小。

這就存在了一個弊端,當我們定義的一個結構體里面有枚舉變量的時候,當枚舉變量值變化的時候,那么結構體的大小就有可能會跟著變化。在沒有給枚舉賦值的時候為結構體申請了堆空間,后面如果給枚舉賦了一個超過4個字節(jié)的值,那么這個時候結構體的實際大小就已經變化了,這樣我們后面程序對該結構體進行操作時就會存在隱患。

2.2 C中枚舉的取值范圍

我們繼續(xù)使用上面的例程來說明取值范圍:

/*****************************************************************************
** Copyright © 2020 lcg. All rights reserved.
** File name: enum.c
** Description: 測試enum的特性
** Author: lcg
** Version: 1.1
** Date: 2020.12.08
*****************************************************************************/
 
#include <stdio.h>
 
enum color1
{
  RED = 0,
  GREEN,
  BLUE
};
 
enum color2
{
  GRAY = 1,
  YELLOW,
  PURPLE
};
 
int main(int argc, char *argv[])
{
  enum color1 myClolor1;
  
  myClolor1 = RED;
  printf("myClolor1: %d\n", myClolor1);
  
  myClolor1 = GRAY;
  printf("myClolor1: %d\n", myClolor1);
  
  myClolor1 = 10;
  printf("myClolor1: %d\n", myClolor1);
  
  return 0;
}

輸出結果:

myClolor1: 0
myClolor1: 1
myClolor1: 10

可以看到,在C下enum定義的變量可以賦規(guī)定范圍外的值的,但是在C++11下這是不允許的。在C++11中編譯會不通過,是C++11對C中enum的優(yōu)化。

三、C++11中的枚舉(enum)

3.1 c++11中新增枚舉大小的控制

在C++11中程序員就可以對枚舉(enum)進行顯式控制其占用內存的大小了,如下示例:

/*****************************************************************************
** Copyright © 2020 lcg. All rights reserved.
** File name: enum.cpp
** Description: 測試enum的特性
** Author: lcg
** Version: 1.2
** Date: 2020.12.08
*****************************************************************************/
 
#include <stdio.h>
 
enum color1 : char {
  RED = 0,
  GREEN,
  BLUE
};
 
enum color2 : int {
  GRAY = 1,
  YELLOW,
  PURPLE
};
 
int main(int argc, char *argv[])
{
  printf("enum color1: %d\n", sizeof(enum color1));
  printf("enum color2: %d\n", sizeof(enum color2));
  
  return 0;
}

輸出結果:

enum color1: 1
enum color2: 4

C++11這樣的特性就可以很好地解決我在前言所說的那些情況啦,可以節(jié)省資源。

3.2 c++11新增有作用域的枚舉類型

如上面2.2小節(jié)的程序如果在C++11的標準中編譯就會出現(xiàn)以下的報錯:

1.cpp:33:15: error: cannot convert ‘color2' to ‘color1' in assignment
     myClolor1 = GRAY;
               ^
1.cpp:36:15: error: invalid conversion from ‘int' to ‘color1' [-fpermissive]
     myClolor1 = 10;

在C++11標準中,enum定義的變量是不可以賦規(guī)定范圍外的值的。這樣為后期的調試帶來了很多的便利之處。

到此這篇關于C和C++11之enum枚舉的具體使用方法的文章就介紹到這了,更多相關C++11 enum枚舉內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++使用泛型導致的膨脹問題

    C++使用泛型導致的膨脹問題

    這篇文章主要介紹了C++使用泛型導致的膨脹,智能家居主機的嵌入式平臺上使用C++進行開發(fā)。FLASH存儲空間有限,這是必須要考慮的因素,一定要重視,下面我們一起進入文章看看詳細內容
    2021-11-11
  • C++?std::chrono庫使用示例(實現(xiàn)C++?獲取日期,時間戳,計時等功能)

    C++?std::chrono庫使用示例(實現(xiàn)C++?獲取日期,時間戳,計時等功能)

    std::chrono是C++標準庫中的一個組件,用于表示和處理時間,這篇文章主要介紹了C++?std::chrono庫使用指南(實現(xiàn)C++?獲取日期,時間戳,計時等功能),需要的朋友可以參考下
    2023-06-06
  • C++計算任意兩個日期天數(shù)差的方法詳解

    C++計算任意兩個日期天數(shù)差的方法詳解

    這篇文章主要為大家詳細介紹了如何利用C++實現(xiàn)任意兩個日期天數(shù)差,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-02-02
  • 用C++類實現(xiàn)單向鏈表的增刪查和反轉操作方法

    用C++類實現(xiàn)單向鏈表的增刪查和反轉操作方法

    下面小編就為大家?guī)硪黄肅++類實現(xiàn)單向鏈表的增刪查和反轉操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • C++入門教程詳解之命名空間、函數(shù)重載、缺省參數(shù)

    C++入門教程詳解之命名空間、函數(shù)重載、缺省參數(shù)

    這篇文章主要介紹了C++入門教程詳解之命名空間、函數(shù)重載、缺省參數(shù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • C/C++ 宏詳細解析

    C/C++ 宏詳細解析

    關于宏的一些語法問題,可以在google上找到。相信我,你對于宏的了解絕對沒你想象的那么多。如果你還不知道#和##,也不知道prescan,那么你肯定對宏的了解不夠
    2013-09-09
  • C++輸入流和輸出流 超級詳細

    C++輸入流和輸出流 超級詳細

    C++ 的開發(fā)者認為數(shù)據(jù)輸入和輸出的過程也是數(shù)據(jù)傳輸?shù)倪^程,數(shù)據(jù)像水一樣從一個地方流動到另一個地方,所以 C++ 中將此過程稱為“流”,實現(xiàn)此過程的類稱為“流類”。下面小編將詳細介紹這個話題,需要的朋友可以參考一下
    2021-09-09
  • C語言中格式化輸出符號%d、%c、%p、%x等詳解

    C語言中格式化輸出符號%d、%c、%p、%x等詳解

    格式化輸出在C語言中非常常用,提供了多種用法來控制輸出的格式,下面這篇文章主要給大家介紹了關于C語言中格式化輸出符號%d、%c、%p、%x等的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • 關于C++復制構造函數(shù)的實現(xiàn)講解

    關于C++復制構造函數(shù)的實現(xiàn)講解

    今天小編就為大家分享一篇關于關于C++復制構造函數(shù)的實現(xiàn)講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • STL 的string類怎么啦

    STL 的string類怎么啦

    在我們研究string類犯了什么毛病之前,還讓我先說一下如何了解一個C++的類。我們要了解一個C++的類,一般來說,要從三個方面入手
    2013-11-11

最新評論