关于C/C++中typedef对于复杂函数简化的一些个人理解

网络上有很多文章介绍了typedef的四种用法,分别是:

  1. 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象;
  2. 用在旧的C代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名;
  3. 用typedef来定义与平台无关的类型。
  4. 为复杂的声明定义一个新的简单的别名。
    其中第四条用法比较难以理解,格式上看上去和前几条差距很大,这里阐述以下我自己对它的理解。
    考虑上文中的例子:
`int *(*a[5])(int, char*);`

可以等效为

typedef int *(*pFun)(int, char*);
pFun a[5];

我们先看等效代码的第二行,用pFun声明了一个长度为5的数组a,而这个pFun是我们在前面typedef语句的关键字,我们要做的是暂时去掉pFun所声明的实例a[5]

pFun;

把前面typedef后面的内容替换到到下面pFun的位置,

int *(*pFun)(int, char*);

再把其中pFun关键字用其声明的对象a[5]替代,

int *(*a[5])(int, char*);

这样就和之前的语句等效了。
再看原文中的另一个套娃:

doube(*)() (*e)[9];

等效为

 typedef double (*pFuny)();
 typedef pFuny (*pFunParamy)[9];
 pFunParamy e;

看声明语句pFunParamy e;,按照上面的方法替换一轮为

pFuny (*e)[9];

再进行一轮替换

double (*(*e)[9])()

形式不太一样,但两者应该是等效的。(猜的)
根据原文描述的“右左法则”法则:
从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向,括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。
我分析了下double (*(*e)[9])();
(*e):变量e是一个数组指针,
(*e)[9]:指向一个长度为9的数组,
*(*e)[9]数组中每个元素是一个指针,
(*(*e)[9])()每个指针指向一个函数,
double (*(*e)[9])()函数的返回值是double类型的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值