共用方式為


Typedef 宣告

typedef 宣告是將 typedef 宣告為儲存類別的宣告。 宣告子會變成新的類型。 您可以使用 typedef 宣告,針對 C 已經定義或您已經宣告的類型建構較短或更有意義的名稱。 Typedef 名稱可讓您封裝可能變更的實作詳細資料。

typedef 宣告的解譯方式和變數或函式宣告相同,但識別項會變成該類型的同義字,而不是假設宣告所指定的類型。

語法

  • declaration:
    declaration-specifiers init-declarator-list opt ;

  • declaration-specifiers
    storage-class-specifier declaration-specifiers opt

    type-specifier declaration-specifiers opt

    type-qualifier declaration-specifiers opt

  • storage-class-specifier
    typedef

  • type-specifier
    void

    char

    short

    int

    long

    float

    double

    signed

    unsigned

    struct-or-union-specifier

    enum-specifier

    typedef-name

  • typedef-name:
    識別項

請注意,typedef 宣告不會建立類型。 它會建立現有類型的同義字,或是可透過其他方式指定之類型的名稱。 將 typedef 名稱做為類型指定名稱時,它可以結合特定的類型指定名稱,但不能結合其他類型指定名稱。 可接受的修飾詞包含 const 和 volatile。

Typedef 名稱和一般識別項共用命名空間 (如需詳細資訊,請參閱命名空間)。 因此,程式可以具有相同名稱的 typedef 名稱和區域範圍識別項。 例如:

typedef char FlagType;

int main()
{
}

int myproc( int )
{
    int FlagType;
}

將相同名稱的區域範圍識別項宣告為 typedef 時,或者宣告相同範圍或內部範圍之結構或等位的成員時,必須指定類型指定名稱。 這個範例說明這項條件約束:

typedef char FlagType;
const FlagType x;

若要重複使用 FlagType 名稱做為識別項、結構成員或等位成員的名稱,必須提供類型:

const int FlagType;  /* Type specifier required */

只有下列做法是不夠的:

const FlagType;      /* Incomplete specification */

因為 FlagType 會被當做類型的一部分,而非將重新宣告的識別項。 這個宣告會被視為不合法的宣告,如同

int;  /* Illegal declaration */

您可以使用 typedef 宣告任何類型,包括指標、函式和陣列類型。 您可以在定義結構或等位類型之前宣告結構或等位類型指標的 typedef 名稱,只要定義的可視性和宣告相同即可。

Typedef 名稱可用來改善程式碼的可讀性。 下列三個 signal 宣告都指定同一個類型,但第一個不使用任何 typedef 名稱。

typedef void fv( int ), (*pfv)( int );  /* typedef declarations */

void ( *signal( int, void (*) (int)) ) ( int );
fv *signal( int, fv * );   /* Uses typedef type */
pfv signal( int, pfv );    /* Uses typedef type */

範例

下列範例示範 typedef 宣告:

typedef int WHOLE; /* Declares WHOLE to be a synonym for int */

請注意,WHOLE 現在可用於變數宣告 (例如 WHOLE i; 或 const WHOLE i;)。 不過,long WHOLE i; 宣告並不合法。

typedef struct club 
{
    char name[30];
    int size, year;
} GROUP;

這個陳述式會將 GROUP 宣告為具有三個成員的結構類型。 由於同時指定了結構標記 club,因此宣告中可以使用 typedef 名稱 (GROUP) 或結構標籤。 您必須使用結構關鍵字加標記,而無法使用結構關鍵字加 typedef 名稱。

typedef GROUP *PG; /* Uses the previous typedef name 
                      to declare a pointer            */

PG 類型會被宣告為 GROUP 類型的指標 (之後也被定義為結構類型)。

typedef void DRAWF( int, int );

這個範例提供類型 DRAWF 給未傳回任何值的函式,並且接受兩個 int 引數。 例如,這表示宣告

DRAWF box; 

相當於下列宣告:

void box( int, int );

請參閱

參考

typedef 規範