2009-06-04 20 views
10

我見過的代碼,如在一些C++代碼頻繁下面我看:在C++中typedefing類的目的是什麼?

typedef class SomeClass SomeClass; 

我很爲難,什麼這實際上實現了。這似乎不會改變任何事情。 typedef這是什麼?如果這樣做有用,是否值得額外的努力?

+4

也許你應該問那個人?而不是去問那個人,而是問那個人。 – DevinB 2009-06-04 21:43:46

+0

我想就它是否真的值得,而不是一個人的解釋達成共識。 – 2009-06-04 21:51:45

+0

而那個人其實是錯的。 「非標籤在C++中隱藏標籤名稱」 - C中既不是真,也不是C++中的真。對於某些靈感,請閱讀此缺陷報告http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407 – 2009-06-04 22:07:25

回答

7

查看此前相關問題的答案。這是從丹·薩克斯的文章,作爲清楚地解釋這個問題,因爲任何一個長帖我遇到:

Difference between 'struct' and 'typedef struct' in C++?

該技術可以防止實際問題(但無可否認罕見的問題)。

這是一個便宜的保險 - 它在運行時或代碼空間是零成本(唯一的代價是源文件中的幾個字節),但是您獲得的保護非常小,以至於看到有人使用它一致。我有一個包含typedef的「新類」片段,但是如果我實際上是在不使用片段的情況下從頭開始編寫類的,那麼我幾乎從不打擾(或者記得嗎?)來添加typedef。

所以我說我不同意大多數這裏給出的意見 - 這是值得投入的類型定義的,但還不夠,我想給任何人(包括我自己)關於不把他們在悲痛中

我一直在問怎麼沒有Typedef的可能會導致意外的行爲類名的例子 - 在這裏是一個例子從薩克斯文章舉或多或少:

#include <iostream> 
#include <string> 

using namespace std; 

#if 0 // change to #if 1 to get different behavior 
     // imagine that this is buried in some header 
     // and even worse - it gets added to a header 
     //  during maintenance... 
string foo() 
{ 
    return "function foo... \n"; 
} 
#endif 

class foo 
{ 
public: 
    operator string() { 
     return "class foo...\n"; 
    } 
}; 

int main() 
{ 
    string s = foo(); 

    printf("%s\n", s.c_str()); 
    return 0; 
} 

當函數聲明是由可見的,程序的行爲默默地改變,因爲功能foo和cla之間沒有名稱衝突ss foo

但是,如果您包含「typedef class foo foo;」,則會收到編譯時錯誤,而不是行爲中的無聲差異。

0

看起來好像評論試圖說的那樣,typedef使SomeClass全局符號的方式阻止任何人聲明一個隱藏原SomeClass的同名本地對象。我試過這個與VC6(不是一個真正的C++編譯器,我知道,但最好的我有自動取款機),它似乎並沒有太多。 SomeClass仍然被同名的本地聲明隱藏。也許它改變了一些編譯器的錯誤信息的內容,使它更有用。

-2

我明白 不同命名空間中的標籤和 標識符生活的概念,但是是 鍵入它這個 真的甚至值得麻煩?

+6

(-1)絕對沒有解釋或推理。我可以輕而易舉地寫下「是」。唯一的區別就是聲譽。 – DevinB 2009-06-04 21:39:55

0

它看起來對我來說,你的同事可能沒有完全從C

在C畢業,如果你聲明struct foo {int a;};,你沒有什麼可以打電話只是foo ,而是struct foo。因此,將012ff鍵入foo的做法相當常見。

這在C++中發生了變化,原因很明顯。

20

它可以防止這樣的代碼進行編譯:

class SomeClass { ... }; 
int SomeClass; 

這是完全合法的C++,雖然它是可怕。如果你這樣做,那麼任何對裸指SomeClass的引用都指向這個變量。要提及課程,您需要在每次使用時明確說出class SomeClass。如果您創建一個typedef

class SomeClass { ... }; 
typedef class SomeClass SomeClass; 
int SomeClass; 

那麼編譯器標誌int SomeClass定義爲錯誤的,因爲它理所當然地應該是。

0

要麼真的破了編譯器,要麼有人不知道他們在做什麼,或者我會這樣想。

6

亞當提供了這樣做的正確理由,但關於你的問題「是否值得麻煩」我會給出一個響亮的「不!」。

SomeClass sc; 

誠然,編譯器將在「錯誤」行了點,但這樣的事情發生如此罕見:可能出現的問題代碼:當位以後有人說

class SomeClass { ... }; 
int SomeClass; 

會被抓住(我認爲我從來沒有見過真正的代碼),它不能證明一個近乎多餘的typedefs森林。