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

例如下面两个声明:

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是一个23200列的数组,这个数组中的每个元素都是指针(左),这个指针指向一个函数(右),并且返回一个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[])())()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值