簡體   English   中英

Typedef和cast

[英]Typedefs and casting

typedef似乎是特定於C ++的(可能在某些其他語言中)。 我發現它隱藏了值的真實數據類型,因此使項目中的新用戶感到困惑。 也許有時縮短打字很有用。 你什么時候推薦使用typedef

我還注意到我不能將typedef-ed值傳遞給接受底層類型的函數?

就像是:

typedef string VAL;
VAL s = "x";
func(string x); // if I try to pass `s`, I get something like no instance of function template match argument list

typedef是一個C和C ++語言標簽,用於從現有類型創建新類型。 最好的地方是將它與C編程語言結合使用,例如以下示例,或者使用它從現有基本類型(短,長等)創建一個新的,更抽象的類型。

typedef struct {
    int iValue;
    int jValue;
} MyValues;
// declare a variable with this struct
MyValues aMyValuesStruct;

在將typedef引入C之前,為了將上述結構用作類型,您必須執行以下操作:

struct _MyValuesStruct {
    int iValue;
    int jValue;
};
// declare a variable with this struct
struct _MyValuesStruct aMyValuesStruct;

在C ++中,結構和類是類似的構造,它們創建新類型,因此typedef對這些類型的變量不那么有用。 但是,如果使用內置基元類型來表示其他更抽象的類型,則typedef語句可幫助您以更抽象的方式指定類型。

使用typedef可以更容易地為類型指定標簽,這樣當程序員讀取源代碼時,他們就可以理解特定變量所代表的內容。 例如,如果你有一個適合unsigned short的顏色值變量,如果你使用typedef為顏色值創建一個新類型並使用它一致然后更容易識別變量包含顏色值而不是其他一些一種unsigned short

typedef還允許使用它可以更容易地找到源中使用特定抽象類型的所有位置,並且更容易更改基礎類型。 例如,如果您的顏色值類型以字節開頭,那么您使用typedef創建一個抽象類型,如typedef unsigned char ColorValue; 然后你發現你需要將它從unsigned char更改為unsigned short ,將有一個地方可以進行更改,如果你對類型的使用相當嚴格,那么這將是你需要的唯一地方做出改變。

也許有時縮短打字很有用。 你什么時候推薦使用typedef?

一個很好的用例是當你想要在不編輯代碼庫的情況下重新映射類型時:

typedef int32_t pixel_t;

另一個是你希望類型更明確的地方,以便代碼的使用變得更加清晰:

typedef int distance_t;

typedef int angular_momentum_t;

您的問題在其他問題中得到了回答。

typedef是有用的(在C和C ++中,也可能是Objective-C?)來抽象實現細節。 優秀的做法是將類型隱藏到程序的某些部分,這些部分不需要知道如何實現類型,以避免污染該代碼與其功能無關的問題,並且更容易更改類型實現必須更改該代碼。

項目的新手可能會發現,如果在可能的情況下隱藏了不必要的細節,實際上更容易處理代碼。

至於你的問題, func(string x); 是函數原型聲明,而不是函數調用。

在某些情況下, typedef用於隱藏表示數據的基礎類型。

例如,標准沒有指定short intintlong int的典型大小,這可能是一個問題。 另一方面,實現應該(現在)提供int8_tint16_tint32_tint64_t (可能還有int128_t具體取決於平台),因此您可以在處置時使用已知值范圍的整數。

但什么是int32_t 好吧,它是一個帶符號的整數,寬度為32位。 它理論上可以是charshort intintlong intlong long int中的任何一個......它應該無關緊要: 它是一個實現細節

因此,在您的標准庫標題中的某些位置,您將看到:

typedef int int32_t; // most likely representation

而這個定義是以平台為條件的。

在您的代碼中,使用int32_t讓您留下那些可怕的平台特性,並專注於手頭的業務您的業​​務

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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