原题:

4、When programmers add new elements to an enumeration, they sometimes forget to add new cases to the appropriate switch statements. How could you use assertions to help detect this problem?

附录中的答案:

.
.
.
default:
ASSERT(FALSE); /*We should never get here*/
break;

把这个问题扩展下:

看到上题的时候,想到了在u-boot中加入启动命令函数的时候曾经犯过错(还有一点,boot中的启动命令函数有点分散了,应该集中下),Z先生推荐我看下《write solid code》,无意中看了android中的源码,就有了如下的记录(非常好,以前没用过):

 //keywords.h
#ifndef KEYWORD int do_chroot(int nargs, char** args);
int do_chdir(int nargs, char** args); #define __MAKE_KEYWORD_ENUM__
/*
*定义KEYWORD宏,此处用了宏的“粘贴”预处理,此时只用到了第一个参数
*/
#define KEYWORD(symbol, flags, nargs, func) K_##symbol, enum {
K_NUKNOWN,
#endif
KEYWORD(capability, OPTION, , NULL)
KEYWORD(chdir, COMMAND, , do_chdir)
KEYWORD(chroot, COMMAND, , do_chroot) #ifdef __MAKE_KEYWORD_ENUM__
KEYWORD_COUNT,
}; #undef __MAKE_KEYWORD_ENUM__
#undef KEYWORD
#endif
 //parser.c
/*
*第一次包含keywords.h,根据keywords.h的代码,首先得到一个枚举定义.
*/
#include "keywords.h" /*
*重新定义KEYWORD宏,此处运用了宏的“#”预处理运算符
*/
#define KEYWORD(symbol, flags, nargs, func) \
[ K_##symbol ] = { #symbol, func, nargs + , flags, }, /*
*定义一个结构体keyword_info数组,它用来描述关键字的一些属性
*/
struct
{
const char *name; //关键字的名称
int (*func)(int nargs, char** args); //对应关键字的处理函数
unsigned char nargs; //参数个数,每个关键字的参数个数是固定的
unsigned char flags; //关键字的属性
}keyword_info[ KEYWORD_COUNT ] = {
[ K_UNKNOWN ] = { "unknown", , , ,},
/*
*第二次包含keywords.h,由于已经重新定义了KEYWORD宏,
*所以以前作为枚举值的关键字现在变成keyword_info数组
*的索引了.
*/
#include "keywords.h"
}; #undef KEYWORD

在parser.c中两次包含了keywords.h文件,首次包含时列出了枚举项,可以作为后文中数组的索引;第二次包含时,由于宏已被定义,因此正好可以实现数组中的各个项。

仿照此种实现,完全可以实现习题4的解答(一个枚举项对应一个相应的处理函数即可,而且可以通过索引来完成,比switch-case快);此外可以实现代码的集中管理,否则太分散了(不然就用grep,有点麻烦)。

write solid code Chapter 2 练习题4 的解答与扩展的更多相关文章

  1. write solid code 零散(原文)

    整理下目录,看了这个文件,幸好未删除. 以下是<write solid code>中的原文摘录. 1.How could I have prevented this bug? 2.How ...

  2. Code Complete 读后总结和新的扩展阅读计划

    Code Complete 读后总结和新的扩展阅读计划 用了一年时间终于将代码大全读完了,在这里做一个简单的总结,并安排下一阶段的扩展阅读计划. 1.选择代码大全作为我程序员职业入门的第一本书,我认为 ...

  3. Clean Code – Chapter 2: Meaningful Names

    Use Intention-Revealing Names The name should tell you why it exists, what it does, and how it is us ...

  4. Clean Code–Chapter 7 Error Handling

    Error handling is important, but if it obscures logic, it's wrong. Use Exceptions Rather Than Return ...

  5. Clean Code – Chapter 6 Objects and Data Structures

    Data Abstraction Hiding implementation Data/Object Anti-Symmetry Objects hide their data behind abst ...

  6. Clean Code – Chapter 5 Formatting

    The Purpose of Formatting Code formatting is about communication, and communication is the professio ...

  7. Clean Code – Chapter 4: Comments

    “Don’t comment bad code—rewrite it.”——Brian W.Kernighan and P.J.Plaugher The proper use of comments ...

  8. Clean Code – Chapter 3: Functions

    Small Blocks and Indenting The blocks within if statements, else statements, while statements, and s ...

  9. 关于write solid code中的memset

    文中说明memset可以通过操作整形以加速程序执行速度,这一点值得肯定,问题在于unicore或arm中协处理器有地址访问对齐检查,如果我们如此操作,编译器最终使用str指令来完成,那么当地址未对齐时 ...

随机推荐

  1. 【Android】7.2 LinearLayout(线性布局)

    分类:C#.Android.VS2015: 创建日期:2016-02-10 一.简介 LinearLayout将容器内的组件一个挨着一个地横向或纵向依次堆叠起来(不重叠).该布局和WPF的StackP ...

  2. copy 的实现原理与深浅拷贝

    转自:http://bbs.9ria.com/thread-210322-1-1.html 首先,从copy开始说,简而言之,copy的目的就是生成一个新的实例,然后把其成员都按原实例赋值.对于非指针 ...

  3. [转]如何使用Fiddler抓取指定浏览器的数据包

    参考资料:https://www.cnblogs.com/lauren1003/p/6519630.html 使用fiddler抓取不到浏览器的包时常用的解决办法: 1.必须先打开Fiddler,再打 ...

  4. How to Enable EPEL Repository for RHEL/CentOS 7.x/6.x/5.x

    What is EPEL EPEL (Extra Packages for Enterprise Linux) is open source and free community based repo ...

  5. $.cookie is not a function;原因及解决办法

    一.没有引入jQuery库文件 二.jQuery库文件和jquery.cookie.js文件的顺序问题.须先引入jQuery库文件再引入cookie插件文件 三.页面的加载顺序所导致 大家的问题大多出 ...

  6. django之对FileField字段的upload_to的设定

    用django开发,经常要处理用户上传的文件, 比如user模型里面如果又个人头像的字段 ImageField等等,而django在FielField字段(包括ImageField)的支持和扩展是做的 ...

  7. Linux下安装Python3.6和第三方库

    如果本机安装了python2,尽量不要管他,使用python3运行python脚本就好,因为可能有程序依赖目前的python2环境, 比如yum!!!!! 不要动现有的python2环境! 一.安装p ...

  8. HttpClient-4.3.X 中get和post方法使用

    转自:http://linhongyu.blog.51cto.com/6373370/1538672 一.简介 HttpClient是Apache Jakarta Common下的子项目,用来提供高效 ...

  9. Windows 2008 Server搭建Radius服务器的方法

    原地址:http://service.tp-link.com.cn/detail_article_1113.html (图拷贝不过来) Windows 2008 Server搭建Radius服务器的方 ...

  10. Tomcat负载均衡和集群环境的搭建

    实现此集群的方法参考了网上的很多文章,但由于很多文章都表明是原创的,故无法知道整个操作流程的真正作者是谁.下面就是我用我们真实的项目去实现这个过程.同时修复这过程中一些问题.以下的所有步骤均为亲自测试 ...