Typedef声明

typedef 声明与 typedef 的声明为存储类。 该声明成为新类型。 可以使用 typedef 声明构造更短或更有意义的名称 C 已定义的类型或对于声明的类型。 Typedef 名称可以封装能更改的实现详细信息。

typedef 声明与变量或函数声明方式解释,但是,标识符,而不是假定该声明指定的类型,将该类型的同义词。

语法

  • declaration:
    声明说明符 init 公告列表opt**;**

  • 声明说明符:
    存储类说明符声明说明符 opt

    类型说明符声明说明符 opt

    类型限定符声明说明符 opt

  • 存储类说明符:
    typedef

  • 类型说明符:
    void

    char

    short

    int

    long

    float

    double

    签名

    unsigned

    结构或联合说明符

    枚举说明符

    typedef 名称

  • typedef 名称:
    identifier

请注意 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 );

此示例对返回值和采用两个 int 参数的函数不提供类型 DRAWF 。 这意味着,例如,声明

DRAWF box; 

与声明等效

void box( int, int );

请参见

参考

typedef说明符