Typedef 声明

typedef 声明是具有作为存储类的 typedef 的声明。 声明符将成为新类型。 可以使用 typedef 声明为已由 C 定义的类型或你已声明的类型构造更短和更有意义的名称。 利用 Typedef 名称,您可以封装可能会发生更改的实现详细信息。

typedef 声明的解释方式与变量或函数声明的解释方式相同,只不过标识符没有假定由声明指定的类型,而是成为了该类型的同义词。

语法

declaration
declaration-specifiersoptinit-declarator-list ;

declaration-specifiers
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt

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
identifier

typedef 声明不会创建新类型。 而是创建现有类型的同义词或可通过其他方式指定的类型的名称。 当使用 typedef 名称作为类型说明符时,可以将其与特定的类型说明符组合,但不可以将其与其他类型说明符组合。 可接受的修饰符包括 constvolatile

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) 或结构标记可用于声明。 必须使用带标记的 struct 关键字,并且不能使用带 typedef 名称的 struct 关键字。

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 );

请参阅

声明和类型