关于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*
。
- 带有一个参数,这个参数的类型是