簡體   English   中英

在C ++中用typedefing類的目的是什么?

[英]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.

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