我听说过一些方法,但都没有卡住.我个人试图避免C中的复杂类型,并尝试将它们分解为组件typedef.
我现在面临着从一个所谓的"三星级程序员"维护一些遗留代码的问题,而且我很难阅读一些***代码[] [].
你如何阅读复杂的C声明?
本文解释了一个相对简单的7条规则,如果您发现自己需要或需要手动执行此操作,它将允许您阅读任何C声明:http://www.ericgiguere.com/articles/reading-c-declarations.html
找到标识符.这是你的出发点.在一张纸上,写"声明标识符为".
向右看.如果那里没有任何东西,或者右括号")",请转到第4步.
您现在位于数组(左括号)或函数(左括号)描述符上.可能存在这些序列,以不匹配的右括号或声明符的结尾(分号或"="表示初始化)结束.对于每个这样的描述符,从左到右阅读:
如果一个空数组"[]",写"数组"
如果一个大小的数组,写"数组大小"
如果函数"()",写"函数返回"
停在不匹配的括号或声明符的末尾,以先到者为准.
返回起始位置并向左看.如果那里什么也没有,或者左括号"(",转到第6步.
您现在位于指针描述符"*"上.左边可能有一个序列,以左括号"("或声明符的开头结束.从右到左阅读,每个指针描述符写"指向".停在不匹配的括号或声明者的开头,以先到者为准.
此时,您有一个带括号的表达式或完整的声明符.如果您有带括号的表达式,请将其视为新的起点并返回步骤2.
记下类型说明符.停止.
如果您对某个工具没问题,那么我建议使用该程序cdecl
:http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html
我通常使用有时被称为"右手顺时针规则"的东西.它是这样的:
从标识符开始.
转到它的右边.
然后顺时针方向移动到左侧.
顺时针移动并向右移动.
只要声明尚未完全解析,请执行此操作.
还有一个额外的元规则需要注意:
如果有括号,请在移出前完成每个级别的括号.
在这里,"前进"和"移动"某处意味着在那里阅读符号.规则是:
*
- 指向
()
- 功能返回
(int, int)
- 功能采取两个整数并返回
int
,char
等- int
,char
等等.
[]
- 数组
[10]
- 十个数组
等等
因此,例如,int* (*xyz[10])(int*, char)
读作:
xyz是一个
一排十
指针
函数接受一个int*和一个char并返回
一个int*
一个字:cdecl
Damnit,被打15秒!