[英]What is the purpose of typedefing a class in C++?
在我正在研究的一些C ++代碼中,我經常看到類似下面的代碼:
typedef class SomeClass SomeClass;
我對這實際上取得的成就感到困惑。 看起來這不會改變任何事情。 這樣的typedef
是做什么用的? 如果這樣做有用,是否值得付出額外的努力?
它會阻止這樣的代碼編譯:
class SomeClass { ... };
int SomeClass;
這是完全合法的C ++,雖然它很糟糕 。 如果這樣做,那么對裸SomeClass
任何引用都會引用該變量。 要引用該類,您需要在每次使用時明確說出class SomeClass
。 如果您創建一個typedef
:
class SomeClass { ... };
typedef class SomeClass SomeClass;
int SomeClass;
然后編譯器將int SomeClass
的定義標記為錯誤,因為它應該是正確的。
請參閱此前相關問題的答案。 丹薩克斯的一篇文章引用了很長的一句話,它解釋了這個問題,就像我遇到的任何事情一樣清楚:
C ++中'struct'和'typedef struct'之間的區別?
該技術可以防止實際問題(盡管這是罕見的問題)。
這是一個廉價的保險 - 它在運行時或代碼空間是零成本(唯一的成本是源文件中的幾個字節),但你得到的保護是如此之小,以至於看到有人一直使用它是不常見的。 我有一個包含typedef的“新類”片段,但是如果我實際上從頭開始編寫一個類而不使用該片段,我幾乎從不打擾(或者它是否記得?)添加typedef。
所以我說我不同意這里給出的大多數意見 - 值得把這些類型的參數放進去,但還不夠,我會給任何人(包括我自己)抱怨不要把它們放進去。
我被問到一個例子,說明沒有類名稱typedef'ed可能會導致意外行為 - 這里有一個例子,或多或少地從Saks文章中解除了:
#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
和類foo
之間沒有名稱沖突。
但是,如果包含“ typedef class foo foo;
”,則會出現編譯時錯誤,而不是行為中的靜默差異。
亞當提供了這樣做的正確理由,但對於你的問題“這是值得的麻煩”,我會給出一個響亮的“不!”。 可能的問題代碼:
class SomeClass { ... };
int SomeClass;
稍后會有人說:
SomeClass sc;
不可否認,編譯器將指向“錯誤”行,但這種事情很少發生(我不認為我曾經在實際代碼中看到它)它無法證明一個近乎多余的typedef森林。
看起來評論試圖說明typedef使符號SomeClass全局化,以防止任何人聲明一個隱藏原始SomeClass同名的本地對象。
我用VC6嘗試了這個(不是我知道的真正的C ++編譯器,但我有最好的ATM),它似乎沒有做太多。 SomeClass仍然被具有相同名稱的本地聲明隱藏。 也許它會改變某些編譯器的錯誤消息的內容,使其更有用。
在我看來,你的同事可能沒有從C完全畢業。
在C中,如果聲明struct foo {int a;};
,你沒有任何你可以稱之為foo
東西,而是struct foo
。 因此,將structff struct foo
作為foo
是相當普遍的。
這在C ++中有所改變,原因應該是相當明顯的。
無論是真的破壞了編譯器還是不知道他們做了什么的人,或者我認為。
我理解標簽和標識符所存在的不同命名空間的概念,但這真的值得輸入嗎?
沒有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.