使用模式匹配更快识别复杂C声明

网上有一个左右法则,其实左右法则适合程序分析,不适合人。
我总结了对人来说一个更简单的法则:模式匹配. 算法如下:

1.找到变量名。程序不容易做,人比较容易。
2.除开变量名后,是它的类型声明,可能有四种复杂, 四种简单模式(为了形式上完整)
其中空格是变量的位置, ???可能是比较复杂东西。
???(* )??? 变量是指针
???( )???或??? ??? 变量是值或数组, 前一种形式括号是多余的.
???(* (???))??? 变量是函数声明,返回类型是指针,指向括号外面的部分
???(* [???])??? 变量是数组,数组类型是指针,指向括号外面的类型
type ; 简单变量type = char/short/long/int/float/struct/union/emnu等
type * 指针,指向type 
type [XX]??? type的数组,多维数组也可以再分析一步,也可以直接得结果.
type (???) 函数
3.把已经识别的部分看成变量
4.如果有余下的部分, 返回第2步.

例如:
int (*ff(int)) (int *,int); => 结果
step 1. 找到ff. 变量ff是...
step 2. 满足???(* (???))??? 函数声明, 参数是(int), 返回值是指针, 指向...
step 3. 除去已经识别部分int (int *, int)
step 2. 满足type (???) 函数, 参数是(int*, int)

int (*Register (int (*pf)(const char *, const char *))) (const char *, const char *)
step 1.找到pf, 这个是找错了,不过没关系.
step 2.满足???(*)???, pf是指针,指向...
step 3.剩下int (*Register (int ^(const char*, const char*)))( const char*, const*)
我用^标出的变量的位置,
step 2.满足??? (???), 是函数
step 3.剩下int (*Register (^))(const char*, const*),
step 2.满足???( )???, 说明是类型, 但注意pf是函数,函数不能再是一个值或数组.所以pf变量其实
不是真正的变量, 所以需要退回上一步,再找一下变量这次可以找出Register
step 1.找出Register
step 2.除出Register得到int (* (pf))(const char*, const*), Register是函数声明, 返回值指向...
step 3.剩下int (const char*, const*) 是函数
-----
题外话,如果先找到Register就比较简单,直接说明它是函数, 返回值是...


float ( * ( * e[10])(int &) ) [5];
变量e, 第一次找到???(* [???])???, e是数组, 成员是...
float ( * (int &) ) [5]; +++ ???(* (???))???, 函数指针, 返回类型是指针, 指向
float [5]; +++ float数组

阅读更多
文章标签: c float 算法
想对作者说点什么? 我来说一句

如何理解C和C++的复杂声明

2011年04月30日 9KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭