如何理解声明

近来读到一篇文章 如何阅读复杂的C定义/声明 很受启发,就将学习感悟记录一下。

[code language="cpp"]
// 首先,下面是最简单的声明
int i;

// 再来一个复杂一些的
int a[3];
// 怎么看?
// 从 a 开始,往右看,[3]
// 这说明 a 是一个含3个元素的数组
// 回到 a ,往左看,

// 这说明数组的每个元素是指针
// 再以 *a[3] 为单位,向右看,; ,到头了
// 再向左看, int ,指针指向的是 int
// 结论:
// a 是一个数组,包含3个元素,每个元素
// 都是指向 int 的指针

// 做一个小修改,意思就全变了:
int (a)[3];
// 怎么看?
// 从 a 开始,往右看, ) ,到头了
// 回到 a ,往左看, *
// 这说明 a 是一个指针(不同了吧)
// 再以 (
a) 为单位,向右看,[3]
// 说明 a 指向一个数组,而且是含有三个元素的数组
// 再往左看, int ,说明数组的元素是 int 型

// 下面看函数的声明:
extern int foo();
// 怎么看?
// foo ,右看,(),是个函数
// 左看,
,返回一个指针
// *foo(),右看,;到头了
// 左看 int ,指针指向 int
// int *foo(),右看;,左看 extern

// 再变化一下
int (foo)();
// 怎么看?
// foo , 右看,) 到头了
// 左看,
,foo 是一个指针
// (*foo) ,右看,(),指向一个函数
// 左看, int ,指向的这个函数,
// 它的返回类型是 int 型
// 有一点要与上一例区分:
// 这里声明的是个变量,而不是函数

// 接下来
int (Object_vtable[])();
// 怎么看?
// Object_vtable,右[],是个数组
// 左
,数组的元素都是指针
// (*Object_vtable[]),右(),指针指向函数
// 左 int ,指向的函数,返回型要是 int

// 找到了右-左-右-左这种规律,
// 看这种定义就很容易看出了!

// 再来一个
int ((vtable)[])();
// 怎么看?
// vtable ,右)到头了
// 左,说明 vtable 是个指针
// (
vtable),右[],说明指向一个数组
// 左,说明数组的元素也是指针
// (
(*vtable)[]),右(),指针指向函数
// 左,int 说明函数的返回类型为 int
[/code]

知道了这个左-右-左法则,不管遇到多么复杂的声明,都有章可循啦!