关于c和c++的类型(3)
这里仅讨论函数相关的复杂类型的解读。
一、嵌在对象定义中的函数类型
有如下函数签名:
int f(int x, int fn(int));
其中参数fn的声明比较复杂:
int fn(int)
对fn类型的解读步骤如下:
-
找到
fn附近的修饰符。fn左侧没有修饰符,右侧有()。因此,fn就是一个函数对象。 -
去掉对象名。
剩下的是:
int (int)这就是函数
fn的类型。 -
得出结论
综上,对象
fn就是一个函数;它的签名具有这样的特征:- 带有一个参数,这个参数的类型是
int。 - 函数返回值类型为
int。
- 带有一个参数,这个参数的类型是
二、嵌在对象定义中的函数指针类型
有如下函数签名:
int f(int x, int (*pf)(int));
其中参数pf的声明比较复杂:
int (*pf)(int)
对pf类型的解读步骤如下:
-
找到
pf附近的修饰符。pf左侧有修饰符*,并且和pf一起括在()中。这对()提升了*的优先级,因此*先和pf结合。这样,无论如何,pf就是一个指针对象。 -
去掉对象名及其就近的修饰符。
剩下的是:
int (int)这就是指针
pf的基类型。很明显,这是一种函数类型。 -
得出结论
综上,对象
pf就是一个指向函数的指针对象;它指向的函数签名具有这样的特征:- 带有一个参数,这个参数的类型是
int。 - 函数返回值类型为
int。
- 带有一个参数,这个参数的类型是
三、与函数定义的对比
将上述fn、pf的定义和如下定义对比:
int *fn(int);
解读步骤一样:
-
找到
fn附近的修饰符。fn左侧有修饰符*,右侧有()。由于()的优先级高于*的,因此fn先和()结合。这样,无论如何,fn就是一个函数对象,即fn是函数名。 -
去掉函数名。
剩下的是:
int *(int)这就是函数
fn的类型。()中的是函数的参数列表。这里,是一个整型参数。()左侧的是函数返回值类型。这里是int*。因此,函数fn要返回整型指针类型。
-
得出结论
综上,对象
fn就是一个函数对象;它具有这样的特征:- 带有一个参数,这个参数的类型是
int。 - 函数返回值类型为整型指针
int*。
- 带有一个参数,这个参数的类型是