建议8:拒绝晦涩难懂的函数指针
在C/C++程序中,数据指针是最直接也是最常用的,理解起来也相对简单容易,但是函数指针理解起来却并不轻松。函数指针在运行时的动态调用中应用广泛,是一种常见而有效的手段。但是,如果不注重一定的使用技巧,函数指针也会变得晦涩难懂。告诉我下面定义的含义是什么?
void (*p[10]) (void (*)());
如此繁琐的语法定义几乎难以辨认,这与我们提倡的可读性背道而驰了。这样的函数指针之所以让程序员发愁,最主要的原因是它的括号太多了,往往会让程序员陷在括号堆中理不清头绪。下面一层一层地来分析吧。第一个括号中的*p[10]是一个指针数组,数组中的指针指向的是一些函数,这些函数参数为void (*)(),返回值为空;参数部分的void (*)()是一个无参数、返回值为空的函数指针。分析这样的代码简直是一种折磨。如何有效地提高函数指针定义的可读性呢?那就是使
用typedef。typedef 方法可以有效地减少括号的数量,可以通过typedef来合理地简化这些声明,理清层次,所以它的使用倍受推荐。以上面的定义为例。首先,声明一个无参数、返回空的函数指针的typedef,如下所示:
typedef void (*pfv)();
接下来,声明另一个typedef,一个指向参数为pfv且返回为空的函数指针:
typedef void (*pFun_taking_pfv) (pfv);
现在,再去声明一个含有10个这样指针的数组就变得轻而易举了,而且可读性有了很
大的提升:

pFun_taking_pfv p[10]; /*等同于void (*p[10]) (void (*)());*/


请记住:函数指针在运行时的动态调用(例如函数回调)中应用广泛。但是直接定义复杂的函数指针会由于有太多的括号而使代码的可读性下降。使用typedef可以让函数指针更直观和易维护。拒绝晦涩难懂的函数指针定义,拒绝函数定义中成堆的括号。

改善C++ 程序的150个建议学习之建议8:拒绝晦涩难懂的函数指针相关推荐

  1. 编写高质量代码改善C++程序的150个建议

    第一部分 语法篇   第1章   从C继承而来的 建议0:不用让main函数返回void main函数的返回类型是int,不是void或其它类型. 建议1:区分0的4种面孔          (1). ...

  2. 改善C++ 程序的150个建议学习之建议5:不要忘记指针变量的初始化

    建议5:不要忘记指针变量的初始化 可以说指针是C/C++语言编程中最给力的工具.指针,让我们直接去面对最为神秘的内存空间,赋予我们对内存进行直接操作的能力.由于指针操作执行速度快.占用内存少,众多程序 ...

  3. C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

  4. c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

  5. Python学习系列 -- 改善 Python 程序的 91 个建议

    转载自:https://zhuanlan.zhihu.com/p/32817459 自己写Python也有四五年了,一直是用自己的"强迫症"在维持自己代码的质量,除了Google的 ...

  6. Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议

    代码是我们前进的基石. 废话不多说直接把本书部分内容展示出来 目录 == 第1章Java开发中通用的方法和准则/1 建议1:不要在常量和变量中出现易混淆的字母/2 建议2:莫让常量蜕变成变量12 建议 ...

  7. 转载:一位资深程序员大牛给予Java初学者的学习路线建议

    一位资深程序员大牛给予Java初学者的学习路线建议 java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来 ...

  8. 《编写高质量代码:改善c程序代码的125个建议》——第1章 数据,程序设计之根本建议1:认识ANSI C...

    本节书摘来自华章计算机<编写高质量代码:改善c程序代码的125个建议>一书中的第1章,建议1,作者:马 伟 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第1 ...

  9. java 151建议_编写高质量代码改善java程序的151个建议——导航开篇

    前言 系列文章: 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,惨不忍睹是吧.确实,人和代码一样都在成长,都在变好当中.有时候只是实现功能的编程,长 ...

最新文章

  1. Hibernate初探
  2. 增加和删除用户组与用户
  3. 用Xshell连接Linux系统时输入反斜杠成W
  4. opencv 星空_opencv如何将大于5000像素点的轮廓绘制出来?
  5. 消息中间件系列(五):MQ消息队列的12点核心原理总结
  6. Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货
  7. LCD1602和12864显示器
  8. java 主类 测试类_Java中的测试类和主类分别是什么,有点晕啊。?
  9. 网易云音乐 linux x32,网易云音乐UWP版旧版本安装包 拒绝更新Win32转制版
  10. 拼接大屏数据展示_拼接大屏幕实现的功能与特点
  11. 特斯拉model3中控屏怎么关_特斯拉Model 3为什么取消仪表盘?
  12. 用html写一个道歉的代码
  13. 六、CSS 速览 —— 平面转换、3D转换、动画
  14. Mybatis的where标签,还有这么多知识点
  15. 简易的js获取星期几的两种方法
  16. Flink-----Flink CDC 实现数据实时同步
  17. 根据Spring上下文对象xxxContext获得*.properties属性文件中的配置属性值
  18. 数据结构(c++)--宝岛探险
  19. Jupyter notebook运行后打不开网页
  20. 浏览器工作原理和V8引擎

热门文章

  1. 创建二叉树并计算结点数
  2. Java做简单的界面
  3. CodeForces 954D-Fight Against Traffic(加边最短路)
  4. IDEA系列:最新IntelliJ IDEA下载地址(社区版和专业版)
  5. unity 设置图片九宫格_Unity UGUI篇 Image图片
  6. 第 7 篇、Linux C基础 | 变量和常量
  7. viterbi算法词性标注_使用Viterbi算法深入研究词性标记
  8. 万字长文带你 搞定 linux BT 宝塔面板 之外网上快速搭建苹果CMS电影网站
  9. 2016 上半年 VR 报告:潜在用户4.5亿
  10. Educoder Python 计算思维训练——文件操作与异常处理