C和C++11之enum枚舉的具體使用方法
一、前言
由于C++項(xiàng)目中用了相對(duì)比較多的枚舉(enum),正常情況下,枚舉變量都是占用一個(gè)整形類型的大小,但是項(xiàng)目中枚舉(enum)只需要使用到一個(gè)字節(jié)的大小,因?yàn)槭窃谇度胧皆O(shè)備上執(zhí)行的代碼,資源比較少,那么如果枚舉都是按照int型大小來使用的話,這無疑是一種資源浪費(fèi)。
所以就想有沒有一種辦法可以控制枚舉(enum)占用內(nèi)存的辦法。所幸,通過查找資料,發(fā)現(xiàn)C++11的新特性剛好加入了控制枚舉大小的機(jī)制。那么接下來我們就來看看,枚舉(enum)在C++11標(biāo)準(zhǔn)有哪些變化?以及C和C++11中的枚舉(enum)有什么區(qū)別?
二、C中的枚舉(enum)
2.1 C中枚舉的大小
前面有說到,默認(rèn)情況下,枚舉enum的大小是一個(gè)整形類型的大小,但是整形類型有很多:int、long int、short int等,所以enum的大小還是不能確定的。在C中enum的大小是不可以通過程序員顯式控制的,這個(gè)大小是編譯器根據(jù)我們給枚舉(enum)賦值的大小來選擇合適的整數(shù)類型的。
下面舉個(gè)例子:
/*****************************************************************************
** Copyright © 2020 lcg. All rights reserved.
** File name: enum.c
** Description: 測(cè)試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;
}
輸出結(jié)果:
enum color1: 4
enum color2: 8
我們發(fā)現(xiàn)這兩個(gè)枚舉變量所占用的大小是不一樣的,enum color2已經(jīng)超過了4個(gè)字節(jié),所以編譯器會(huì)根據(jù)實(shí)際值的大小來調(diào)整枚舉變量的大小。
這就存在了一個(gè)弊端,當(dāng)我們定義的一個(gè)結(jié)構(gòu)體里面有枚舉變量的時(shí)候,當(dāng)枚舉變量值變化的時(shí)候,那么結(jié)構(gòu)體的大小就有可能會(huì)跟著變化。在沒有給枚舉賦值的時(shí)候?yàn)榻Y(jié)構(gòu)體申請(qǐng)了堆空間,后面如果給枚舉賦了一個(gè)超過4個(gè)字節(jié)的值,那么這個(gè)時(shí)候結(jié)構(gòu)體的實(shí)際大小就已經(jīng)變化了,這樣我們后面程序?qū)υ摻Y(jié)構(gòu)體進(jìn)行操作時(shí)就會(huì)存在隱患。
2.2 C中枚舉的取值范圍
我們繼續(xù)使用上面的例程來說明取值范圍:
/*****************************************************************************
** Copyright © 2020 lcg. All rights reserved.
** File name: enum.c
** Description: 測(cè)試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;
}
輸出結(jié)果:
myClolor1: 0
myClolor1: 1
myClolor1: 10
可以看到,在C下enum定義的變量可以賦規(guī)定范圍外的值的,但是在C++11下這是不允許的。在C++11中編譯會(huì)不通過,是C++11對(duì)C中enum的優(yōu)化。
三、C++11中的枚舉(enum)
3.1 c++11中新增枚舉大小的控制
在C++11中程序員就可以對(duì)枚舉(enum)進(jìn)行顯式控制其占用內(nèi)存的大小了,如下示例:
/*****************************************************************************
** Copyright © 2020 lcg. All rights reserved.
** File name: enum.cpp
** Description: 測(cè)試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;
}
輸出結(jié)果:
enum color1: 1
enum color2: 4
C++11這樣的特性就可以很好地解決我在前言所說的那些情況啦,可以節(jié)省資源。
3.2 c++11新增有作用域的枚舉類型
如上面2.2小節(jié)的程序如果在C++11的標(biāo)準(zhǔn)中編譯就會(huì)出現(xiàn)以下的報(bào)錯(cuò):
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標(biāo)準(zhǔn)中,enum定義的變量是不可以賦規(guī)定范圍外的值的。這樣為后期的調(diào)試帶來了很多的便利之處。
到此這篇關(guān)于C和C++11之enum枚舉的具體使用方法的文章就介紹到這了,更多相關(guān)C++11 enum枚舉內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)循環(huán)打印星號(hào)圖形再鏤空
這篇文章主要介紹了C語言實(shí)現(xiàn)循環(huán)打印星號(hào)圖形再鏤空,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C/C++實(shí)現(xiàn)7bit與8bit編碼互相轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了如何使用C/C++實(shí)現(xiàn)7bit與8bit編碼互相轉(zhuǎn)換功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-10-10
C++實(shí)現(xiàn)寵物商店信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)寵物商店信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++求1到n中1出現(xiàn)的次數(shù)以及數(shù)的二進(jìn)制表示中1的個(gè)數(shù)
這篇文章主要介紹了C++求1到n中1出現(xiàn)的次數(shù)以及數(shù)的二進(jìn)制表示中1的個(gè)數(shù),兩道基礎(chǔ)的算法題目,文中也給出了解題思路,需要的朋友可以參考下2016-02-02

