2012-06-05 32 views
5

是否有特別好的理由選擇使用詳細的類型說明符?例如,在某些情況下,需要使用templatetypename關鍵字來消除依賴template或類型的歧義。何時使用詳細的類型說明符

但我想不出任何例子,如枚舉這樣的事情會發生。看看下面的代碼示例:

enum Foo { A, B }; 

void bar(Foo foo); 
void baz(enum Foo foo); 

我爲什麼會選擇使用語法baz()提供了bar()(反之亦然)?有沒有模糊的情況?

+3

是不是巴茲語法只是從舊的C風格的遺留物,你沒有鍵入枚舉枚舉,所以你必須明確指出它爲枚舉?就像你會如何使用struct Foo f;如果你沒有鍵入結構體?在C++中,typedef隱含在enum/struct聲明中,因此您不必聲明該類型是enum/struct也許? – cppguy

+0

類似... http://stackoverflow.com/questions/742699/returning-an-enum-from-a-function-in-c – 2012-06-05 18:14:15

回答

7

沒有理由使用這種說明符,除非您正在處理名稱被不同「種類」的名稱隱藏的情況。例如,它是完全合法的聲明名爲枚舉聲明後Foo變量,因爲,說非正式的,對象名稱和類型名稱住在獨立的「名稱空間」(見3.3/4的更正式的規範)

enum Foo { A, B }; 

int Foo; 

int Foo聲明後,您的bar聲明將失效,而更詳細的baz聲明仍然有效。

+0

這是有道理的;我沒有考慮過這種情況。當然,我會打任何人,但我喜歡瞭解這些角落案例。謝謝! (也對其他人)。 – Shirik

2

聲明用戶定義的類型需要詳細的類型說明符。一個用例是轉發聲明你的類型。在你有相同名稱的功能作爲enum你必須在範圍上可見,你可能需要使用精細的類型說明符函數聲明萬一:

enum A { A_START = 0 }; 

void A(enum A a) {} 

int main() { 
    enum A a; 
    A(a); 
} 
0

,可能出現了一個例子是當你有類型,也有一個同名的非類型元素。通過使用精細的類型說明符,你可以明確請求類型:

struct foo {}; 
void foo(struct foo) {} 
int main() { 
    struct foo f; 
    foo(f); 
} 

沒有詳盡的類型說明符,foomainvoid foo(struct foo),而不是類型struct foo。現在,我不希望那樣做在生產代碼中,但你只是要求一個重要的例子。如果類型和函數(或變量)是在不同的命名空間中定義的,其中非類型在查找中較早找到,則會發生同樣的情況。您可以將struct替換爲上面的enum

0

選擇使用詳細類型說明符的一個很好的理由是在頭文件中轉發declare結構或類。給定一個標題來定義類型

// a.h 
struct foo {}; 

可以包括標題爲原型的功能

#include "a.h" 
void foo(foo *) ; 

或使用精細的類型:

void foo(struct foo *) ; 

,或者使用explcitly向前聲明詳細說明型號:

struct foo ; 
void foo(foo *) ; 

最後兩種方法中的任何一種都可以幫助避免您的標題逐漸退化爲一個完全連接的網頁,其中包括任何單個標題都會吸引所有其他標題(我在一個軟件產品上工作,這是令人遺憾的事情,迫使您重建世界經過多種你可以想象得到的變化會被邏輯隔離)。

我知道C++ 11也允許這種類型的枚舉類型的前向引用,這是C++ 01編譯器當前不允許的。