Typedef声明
typedef 声明与 typedef 的声明为存储类。 该声明成为新类型。 可以使用 typedef 声明构造更短或更有意义的名称 C 已定义的类型或对于声明的类型。 Typedef 名称可以封装能更改的实现详细信息。
typedef 声明与变量或函数声明方式解释,但是,标识符,而不是假定该声明指定的类型,将该类型的同义词。
语法
declaration:
声明说明符 init 公告列表opt**;**声明说明符:
存储类说明符声明说明符 opt类型说明符声明说明符 opt
类型限定符声明说明符 opt
存储类说明符:
typedef类型说明符:
voidchar
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 );