Typedef declaration
Typedef declaration
的typedef声明
提供了一种方式来声明的标识符作为一个类型别名,要使用的替换可能复杂的类型名称。
该关键字typedef
在声明中用于存储类说明符的语法位置,但不影响存储或关联:
typedef int int_t; // declares int_t to be an alias for the type int
typedef 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 (自C99以来) | |
---|
注释
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 space
struct tnode {
int count;
tnode *left, *right; // same as struct tnode *left, *right;
}; // now tnode is also a complete type
tnode 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 ints
int (*(*callbacks[5])(void))[3]
// same with typedefs
typedef int arr_t[3]; // arr_t is array of 3 int
typedef arr_t* (*fp)(void // pointer to function returning arr_t*
fp callbacks[5];
库经常将依赖于系统或依赖于配置的类型显示为typedef名称,以向用户或其他库组件提供一致的接口:
#if defined(_LP64)
typedef int wchar_t;
#else
typedef long wchar_t;
#endif
参考
- C11标准(ISO / IEC 9899:2011):
关键词
typedef
.