您的位置:首页 > 其它

复杂的指针声明的两种解读方法

2009-04-18 12:28 288 查看
例如下面两个声明:

char* const*
(*ss[23][200])(void (*)(int h, void (*)(void))));
int *(*f4())[10]();
上面两个例子都是从经典的C/C++书上找到的。《C++编程思想》和《C FAQS》两本书上总共给出了两种解读的方法:使用cdecl工具;从标识符开始按照右——左——右——……这个顺序手工解读。
第一种方法:给cdecl提供复杂的声明,它可以给出对应的自然语言的英文解释。
cdecl> explain char* const*
(*ss[23][200])(void (*)(int , void (*)(void)));
declare ss as array 23 of array 200 of
pointer to function (pointer to function (int, pointer to function (void)
returning void) returning void) returning pointer to const pointer to char

cdecl> explain int* (*f4())[10]()
declare f4 as function returning pointer to
array 10 of function returning pointer to int

第二种方法:从标识符开始,按照右——左——右——……这样的顺序解读。
对于:char* const* (*ss[23][200])(void (*)(int h, void
(*)(void))));
其所要声明的标识符为ss,从ss起往右看,得知ss是一个23行200列的数组,这个数组中的每个元素都是指针(左),这个指针指向一个函数(右),并且返回一个char* const*的指针(左)。这个函数带一个参数(void (*)(…)),这个参数是一个指向函数的指针(右),并且返回void(左)。这个指针所指向的函数带两个参数,第一个参数是int,第二个参数是void
(*)(void),即第二个参数是返回值和参数都为void的函数指针。
然后把上面这段话仔细整理,逐一把单个类型给typedef出来,就看得很清楚了。
对于:int *(*f4())[10]();
标识符是f4,从f4开始,它是一个函数(往右走,碰到一对括号),返回值是一个指针(左),这个指针指向10个元素的数组(右,遇到数组下标符号),数组中的每个元素都是指向返回值为int*的函数指针。

除此以外,cdecl还可以根据输入的自然语言描述的类型生成C语言声明,例如C FAQS中给的例子:
cdecl> declare a
as array of pointer to function returning pointer to function returning pointer
to char

char *(*(*a[])())()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: