6.7.9 类型定义
语法
typedef-name的语法形式就是一个标识符。
约束
- 若某个
typedef名表示变长修改类型,那么它必须具有块作用域。
语义
在带
typedef存储类说明符的声明中,每个声明符都会把对应标识符定义成一个typedef名。typedef不会引入新类型;它只为已有类型取了一个同义名。因此:
c
typedef T type_ident;
type_ident D;1
2
2
并不是先造出一种新类型再声明 D,而是把 type_ident 绑定到 T,随后 D 继续按普通声明符规则从 T 派生。
若
typedef名涉及 VLA 或typeof,相关数组大小表达式会在每次执行到该typedef声明时求值。typedef名与普通声明符声明出来的其他标识符共享同一命名空间。若在内层块里重新声明同名标识符,那么这个内层声明不能再走类型推导规则。
例子
- 下面这些都有效:
c
typedef int MILES, KLICKSP();
typedef struct { double hi, lo; } range;
MILES distance;
extern KLICKSP *metricp;
range x;
range z, *zp;1
2
3
4
5
6
7
2
3
4
5
6
7
typedef也能改善复杂函数类型声明的可读性:
c
typedef void fv(int), (*pfv)(int);
pfv signal(int, pfv);1
2
2
- 若
typedef名表示 VLA,那么长度在定义typedef名时固定,而不是每次使用时重新取当前表达式值。