簡體   English   中英

為什么在C ++中聲明枚舉時使用typedef?

[英]Why do you use typedef when declaring an enum in C++?

我多年沒有寫過任何C ++,現在我想回到它。 然后我跑過去想着放棄:

typedef enum TokenType
{
    blah1   = 0x00000000,
    blah2   = 0X01000000,
    blah3   = 0X02000000
} TokenType;

這是什么? 為什么在這里使用typedef關鍵字? 為什么名稱TokenType在此聲明中出現兩次? 語義與此有何不同:

enum TokenType
{
    blah1 = 0x00000000,
    blah2=0x01000000,
    blah3=0x02000000
};

在C中,以第一種方式聲明你的枚舉允許你像這樣使用它:

TokenType my_type;

如果你使用第二種風格,你將被迫聲明你的變量:

enum TokenType my_type;

正如其他人所說,這對C ++沒有任何影響。 我的猜測是,寫這篇文章的人要么是C程序員,要么是將C代碼編譯為C ++。 無論哪種方式,它都不會影響代碼的行為。

如果您這樣做,它是C語言中的C遺產:

enum TokenType
{
    blah1   = 0x00000000,
    blah2   = 0X01000000,
    blah3   = 0X02000000
};

你必須使用它做類似的事情:

enum TokenType foo;

但是如果你這樣做:

typedef enum e_TokenType
{
    blah1   = 0x00000000,
    blah2   = 0X01000000,
    blah3   = 0X02000000
} TokenType;

你將能夠聲明:

TokenType foo;

但是在C ++中,您只能使用前一個定義並將其用作C typedef。

你不需要這樣做。 在C(不是C ++)中,您需要使用枚舉Enumname來引用枚舉類型的數據元素。 為了簡化它,你被允許它的typedef一個名稱的數據類型。

typedef enum MyEnum { 
  //...
} MyEnum;

允許函數將枚舉的參數定義為

void f( MyEnum x )

而不是更長的

void f( enum MyEnum x )

請注意,typename的名稱不必等於枚舉的名稱。 結構也是如此。

另一方面,在C ++中,它不是必需的,因為枚舉,類和結構可以通過其名稱直接作為類型訪問。

// C++
enum MyEnum {
   // ...
};
void f( MyEnum x ); // Correct C++, Error in C

在C中,它是一種很好的風格,因為你可以將類型改為枚舉之外的東西。

typedef enum e_TokenType
{
    blah1   = 0x00000000,
    blah2   = 0X01000000,
    blah3   = 0X02000000
} TokenType;

foo(enum e_TokenType token);  /* this can only be passed as an enum */

foo(TokenType token); /* TokenType can be defined to something else later
                         without changing this declaration */

在C ++中,您可以定義枚舉,以便它將編譯為C ++或C.

來自C的保留

有人說C沒有命名空間,但技術上並不正確。 它有三個:

  1. 標簽( enumunionstruct
  2. 標簽
  3. (其他一切)

typedef enum { } XYZ; 聲明一個匿名枚舉,並將其導入名為XYZ的全局命名空間。

typedef enum ABC { } XYZ; 在標記名稱空間中聲明一個名為ABC的枚舉,然后將其作為XYZ導入全局名稱空間。

有些人不想打擾單獨的命名空間,因此他們輸入了所有內容。 其他人從不打字,因為他們想要命名空間。

這有點老了,但無論如何,我希望你會欣賞我要輸入的鏈接,因為當我今年早些時候遇到它時我很感激。

這里 當我必須掌握一些討厭的typedef時,我應該引用我腦海中總是存在的解釋:

在變量聲明中,引入的名稱是相應類型的實例。 [...]但是,當typedef關鍵字在聲明之前時,引入的名稱是相應類型的別名

正如許多人之前所說的那樣,沒有必要在C ++中使用typedef聲明枚舉。 但這是對typedef語法的解釋! 我希望它有所幫助(可能不是OP,因為它已經差不多10年了,但任何人都在努力理解這些事情)。

在某些C codestyle指南中,typedef版本被認為是“清晰度”和“簡單性”的首選版本。 我不同意,因為typedef模糊了聲明對象的真實性質。 實際上,我不使用typedef,因為在聲明C變量時我想清楚對象的實際內容。 這種選擇有助於我更快地記住舊代碼實際執行的操作,並在將來維護代碼時幫助其他人。

“為什么”問題的實際答案(現有答案令人驚訝地忽略了這個老問題)是這個enum聲明可能位於一個頭文件中,該文件旨在作為C和C ++代碼進行交叉編譯(即包含在C和C ++實現文件中)。 編寫此類頭文件的藝術依賴於作者選擇在兩種語言中具有適當兼容含義的語言功能的能力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM