C
C 语法

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.