6.7.8 类型名
语法
类型名由两部分组成:
specifier-qualifier-list- 可选的抽象声明符
所谓抽象声明符,本质上就是“去掉标识符后的声明符”。
直接抽象声明符可以继续派生出:
- 数组类型;
- 函数类型。
语义
在许多上下文中,标准需要你“写出一个类型”,而不是声明一个带名字的对象或函数;这时就用类型名。
从语法上看,类型名可以理解为:
- 写一条正常声明;
- 然后把标识符删掉。
直接抽象声明符后若跟属性,这些属性附着到前面的数组类型或函数类型。
这种属性只影响当前出现它的类型名,不会影响其他声明中同一类型的用法。
典型例子
- 下面这些写法分别表示:
c
int
int *
int *[3]
int (*)[3]
int (*)[*]
int *()
int (*)(void)
int (*const [])(unsigned int, ...)1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 对应含义依次是:
int- 指向
int的指针 - 由 3 个“指向
int的指针”组成的数组 - 指向“3 个
int的数组”的指针 - 指向“未指定长度的 VLA”的指针
- 无参数、返回
int *的函数类型 - 指向“无参数、返回
int的函数”的指针 - 由若干个常量函数指针组成的数组