的typedef声明提供了一种方式来声明的标识符作为一个类型别名,要使用的替换可能复杂的类型名称。
该关键字typedef在声明中用于存储类说明符的语法位置,但不影响存储或关联:
typedef int int_t; // declares int_t to be an alias for the type inttypedef char char_t, *char_p, (*fp)(void); // declares char_t to be an alias for char // char_p to be an alias for char* // fp to be an alias for char(*)(void)
说明
如果声明使用typedef存储类说明符,则其中的每个声明符都将标识符定义为指定类型的别名。由于声明中只允许使用一个存储类说明符,因此typedef声明不能为静态或外部。
typedef声明不会引入独特的类型,它只会为现有类型建立同义词,因此typedef名称与它们所属的类型兼容。Typedef名称与普通标识符(如枚举器,变量和函数)共享名称空间。
VLA的typedef只能出现在块范围内。每次控制流经过typedef声明时,都会评估数组的长度,而不是声明数组本身:void copyt(int n){typedef int Bn; // B是VLA,其大小为n,现在评估n + = 1; B a; // a的大小是从之前的+ n = 1 int bn; // a和b的大小不同(int i = 1; i
注释
typedef名称可能是不完整的类型,可以像往常一样完成:
typedef int A[]; // A is int[]A a = {1, 2}, b = {3,4,5}; // type of a is int[2], type of b is int[3]
通常使用typedef声明将名称从标记名称空间注入到普通名称空间中:
typedef struct tnode tnode; // tnode in ordinary name space // is an alias to tnode in tag name spacestruct tnode {
int count;
tnode *left, *right; // same as struct tnode *left, *right;}; // now tnode is also a complete typetnode s, *sp; // same as struct tnode s, *sp;
他们甚至可以避免使用标签名称空间:
typedef struct { double hi, lo; } range;range z, *zp;
Typedef名称通常也用于简化复杂声明的语法:
// array of 5 pointers to functions returning pointers to arrays of 3 intsint (*(*callbacks[5])(void))[3] // same with typedefstypedef int arr_t[3]; // arr_t is array of 3 inttypedef arr_t* (*fp)(void); // pointer to function returning arr_t*fp callbacks[5];
库经常将依赖于系统或依赖于配置的类型显示为typedef名称,以向用户或其他库组件提供一致的接口:
#if defined(_LP64)typedef int wchar_t;#elsetypedef long wchar_t;#endif
参考
C11标准(ISO / IEC 9899:2011):6.7.8类型定义(p:137-138)
C99标准(ISO / IEC 9899:1999):6.7.7类型定义(p:123-124)
C89 / C90标准(ISO / IEC 9899:1990):3.5.6类型定义
关键词
typedef.