我見過的代碼,如在一些C++代碼頻繁下面我看:在C++中typedefing類的目的是什麼?
typedef class SomeClass SomeClass;
我很爲難,什麼這實際上實現了。這似乎不會改變任何事情。 typedef
這是什麼?如果這樣做有用,是否值得額外的努力?
我見過的代碼,如在一些C++代碼頻繁下面我看:在C++中typedefing類的目的是什麼?
typedef class SomeClass SomeClass;
我很爲難,什麼這實際上實現了。這似乎不會改變任何事情。 typedef
這是什麼?如果這樣做有用,是否值得額外的努力?
查看此前相關問題的答案。這是從丹·薩克斯的文章,作爲清楚地解釋這個問題,因爲任何一個長帖我遇到:
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;
」,則會收到編譯時錯誤,而不是行爲中的無聲差異。
看起來好像評論試圖說的那樣,typedef使SomeClass全局符號的方式阻止任何人聲明一個隱藏原SomeClass的同名本地對象。我試過這個與VC6(不是一個真正的C++編譯器,我知道,但最好的我有自動取款機),它似乎並沒有太多。 SomeClass仍然被同名的本地聲明隱藏。也許它改變了一些編譯器的錯誤信息的內容,使它更有用。
我明白 不同命名空間中的標籤和 標識符生活的概念,但是是 鍵入它這個 真的甚至值得麻煩?
號
(-1)絕對沒有解釋或推理。我可以輕而易舉地寫下「是」。唯一的區別就是聲譽。 – DevinB 2009-06-04 21:39:55
它看起來對我來說,你的同事可能沒有完全從C
在C畢業,如果你聲明struct foo {int a;};
,你沒有什麼可以打電話只是foo
,而是struct foo
。因此,將012ff鍵入foo
的做法相當常見。
這在C++中發生了變化,原因很明顯。
它可以防止這樣的代碼進行編譯:
class SomeClass { ... };
int SomeClass;
這是完全合法的C++,雖然它是可怕。如果你這樣做,那麼任何對裸指SomeClass
的引用都指向這個變量。要提及課程,您需要在每次使用時明確說出class SomeClass
。如果您創建一個typedef
:
class SomeClass { ... };
typedef class SomeClass SomeClass;
int SomeClass;
那麼編譯器標誌int SomeClass
定義爲錯誤的,因爲它理所當然地應該是。
要麼真的破了編譯器,要麼有人不知道他們在做什麼,或者我會這樣想。
亞當提供了這樣做的正確理由,但關於你的問題「是否值得麻煩」我會給出一個響亮的「不!」。
SomeClass sc;
誠然,編譯器將在「錯誤」行了點,但這樣的事情發生如此罕見:可能出現的問題代碼:當位以後有人說
class SomeClass { ... };
int SomeClass;
會被抓住(我認爲我從來沒有見過真正的代碼),它不能證明一個近乎多餘的typedefs森林。
也許你應該問那個人?而不是去問那個人,而是問那個人。 – DevinB 2009-06-04 21:43:46
我想就它是否真的值得,而不是一個人的解釋達成共識。 – 2009-06-04 21:51:45
而那個人其實是錯的。 「非標籤在C++中隱藏標籤名稱」 - C中既不是真,也不是C++中的真。對於某些靈感,請閱讀此缺陷報告http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407 – 2009-06-04 22:07:25