6.7.7.1 一般规定
IMPORTANT
声明符是 C 里最容易看乱的部分。标准这里的核心套路是:先有一个基础类型 T,再让声明符一层层把它改造成“指向 T 的指针”“返回 T 的函数”“元素为 T 的数组”等派生类型。
语法骨架
声明符由两部分组成:
- 可选的
pointer direct-declarator
- 可选的
direct-declarator可以是:- 标识符
- 括号包住的声明符
- 数组声明符
- 函数声明符
参数声明既可以带完整声明符,也可以只有抽象声明符。
语义
每个声明符在一条声明内部只声明一个对象、函数或类型名。
前面的说明符序列提供基础类型和其他属性;声明符再在此基础上派生出最终类型。
若一个完整声明符内部出现了变长数组类型,则该完整声明符所形成的类型就是变长修改类型;从这种类型再继续派生出来的类型也仍然是变长修改类型。
后续各小节都采用同一记号:
c
T D11
其中 T 表示基础类型说明符序列,D1 是声明符。
- 若声明符形式只是:
c
identifier1
那么该标识符的类型就是 T 本身;若标识符后有属性,则这些属性附着到被声明实体上。
- 若声明符写成:
c
(D)1
它与不加括号时指定的是同一类型;括号的作用只是改变复杂声明符中的结合方式。
实现限制
- 实现可以限制一个基础类型上最多叠加多少层指针、数组和函数声明符。