6.7.7.4 函数声明符
约束
函数声明符不能把函数返回类型指定成:
- 函数类型;
- 数组类型。
形参声明中唯一允许出现的存储类说明符是
register。如果该函数声明符属于函数定义的一部分,那么形参在调整后不得仍是不完整类型。
语义
- 若在声明
T D1中,D1形如:
c
D(parameter-type-listopt)1
那么 D 所声明实体的类型会变成“返回 T 的函数”,但这里返回的是 T 的无限定、非原子版本。
参数类型列表既说明形参类型,也可以顺便声明这些形参的名字。
形参若声明成“数组类型”,会自动调整为“指向元素类型的指针”;若
[]内还写了限定符,则这些限定符转而修饰这个指针。若
[]内还写了static N,则对每次调用都作出承诺:对应实参应能访问到至少N个元素。形参若声明成“返回某类型的函数”,会自动调整成“指向该函数的指针”。
若参数列表以
...结束,则后续参数的数量和类型都不再由原型说明。唯一形参为无名
void时,表示函数没有参数。在形参声明中,如果某个名字既可被解释为
typedef名,也可被解释为形参名,那么必须解释为typedef名。若函数声明符不属于函数定义,则形参可以是不完整类型,也可以在声明符中使用
[*]。若函数声明符没有参数类型列表,则其效果等同于参数类型列表为
void;它仍然提供函数原型。两个函数类型要兼容,必须:
- 返回类型兼容;
- 参数个数一致;
- 最后是否带省略号一致;
- 对应参数类型兼容。
- 在比较函数类型兼容性时:
- 数组形参按调整后的指针类型看;
- 限定类型形参按其无限定版本看。
例子
int (*pfi)();是“指向函数的指针”;而int *fip();是“返回int *的函数”。double a[restrict static 3][5]这种形参写法,比double a[][5]多表达了两个承诺:- 实参非空;
- 至少指向 3 个长度为 5 的数组。