91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

enum枚舉如何在C語言或和C++11中使用

發布時間:2020-12-09 15:25:59 來源:億速云 閱讀:326 作者:Leah 欄目:開發技術

enum枚舉如何在C語言或和C++11中使用?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

一、前言

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

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

二、C中的枚舉(enum)

2.1 C中枚舉的大小

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

下面舉個例子:

/*****************************************************************************
** 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

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

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

2.2 C中枚舉的取值范圍

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

/*****************************************************************************
** Copyright &copy; 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定義的變量可以賦規定范圍外的值的,但是在C++11下這是不允許的。在C++11中編譯會不通過,是C++11對C中enum的優化。

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

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

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

/*****************************************************************************
** Copyright &copy; 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這樣的特性就可以很好地解決我在前言所說的那些情況啦,可以節省資源。

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

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

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定義的變量是不可以賦規定范圍外的值的。這樣為后期的調試帶來了很多的便利之處。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阜阳市| 宣化县| 锡林浩特市| 醴陵市| 平湖市| 蓝山县| 大关县| 澄城县| 黎平县| 三台县| 洛扎县| 荥经县| 开远市| 荆州市| 彭泽县| 潞西市| 辛集市| 东源县| 博客| 吉首市| 德钦县| 交城县| 吉水县| 彰化市| 额尔古纳市| 成武县| 饶平县| 泉州市| 桦川县| 黎川县| 平和县| 铁岭市| 房产| 铜梁县| 蚌埠市| 兴山县| 萝北县| 博客| 察雅县| 会昌县| 宜兰市|