这里仅讨论函数相关的复杂类型的解读。

一、嵌在对象定义中的函数类型

有如下函数签名:

int f(int x, int fn(int));

其中参数fn的声明比较复杂:

int fn(int)

fn类型的解读步骤如下:

  1. 找到fn附近的修饰符。

    fn左侧没有修饰符,右侧有()。因此,fn就是一个函数对象。

  2. 去掉对象名。

    剩下的是:

    int (int)

    这就是函数fn的类型。

  3. 得出结论

    综上,对象fn就是一个函数;它的签名具有这样的特征:

    • 带有一个参数,这个参数的类型是int
    • 函数返回值类型为int

二、嵌在对象定义中的函数指针类型

有如下函数签名:

int f(int x, int (*pf)(int));

其中参数pf的声明比较复杂:

int (*pf)(int)

pf类型的解读步骤如下:

  1. 找到pf附近的修饰符。

    pf左侧有修饰符*,并且和pf一起括在()中。这对()提升了*的优先级,因此*先和pf结合。这样,无论如何,pf就是一个指针对象。

  2. 去掉对象名及其就近的修饰符。

    剩下的是:

    int (int)

    这就是指针pf的基类型。很明显,这是一种函数类型。

  3. 得出结论

    综上,对象pf就是一个指向函数指针对象;它指向的函数签名具有这样的特征:

    • 带有一个参数,这个参数的类型是int
    • 函数返回值类型为int

三、与函数定义的对比

将上述fnpf的定义和如下定义对比:

int *fn(int);

解读步骤一样:

  1. 找到fn附近的修饰符。

    fn左侧有修饰符*,右侧有()。由于()的优先级高于*的,因此fn先和()结合。这样,无论如何,fn就是一个函数对象,即fn是函数名。

  2. 去掉函数名。

    剩下的是:

    int *(int)

    这就是函数fn的类型。

    • ()中的是函数的参数列表。这里,是一个整型参数。
    • ()左侧的是函数返回值类型。这里是int*。因此,函数fn要返回整型指针类型。
  3. 得出结论

    综上,对象fn就是一个函数对象;它具有这样的特征:

    • 带有一个参数,这个参数的类型是int
    • 函数返回值类型为整型指针int*