原题:

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. Viso Professional 2013版本激活(office 系列产品 -- visio 2013 / project 2013 破解工具 - KMSpico)

    背景: 环境是 win7, 64 bit 装了 visio 2013 , 可以却不能用它来画图,在网上找了一些破解工具,大都不能解决问题.网上不靠谱的广告型文章太多了,比较头痛. 所幸,终于找到正确的 ...

  2. [leetcode] Longest Palindromic Substring 多种解法

    非常经典的题目,求字符串中的最长回文子串. (1)最朴素的解法 ---暴力 复杂度O(N³) 这也是最easy想到的方法.最外层循环枚举起点i,第二层循环从i+1開始向后枚举,第三层推断是不是回文串. ...

  3. 把UIView转成UIImage,解决模糊失真问题

    近期工作中,遇到一个需求,须要把一个UIView对象转成UIImage对象显示.经过网络搜索.找到例如以下答案: ? 1 2 3 4 5 6 7 8 -(UIImage*)convertViewToI ...

  4. IAsyncResult 接口

    IAsyncResult 接口由包含可异步操作的方法的类实现.它是启动异步操作的方法的返回类型,如 FileStream.BeginRead,也是结束异步操作的方法的第三个参数的类型,如 FileSt ...

  5. vim 学习日志(6):分屏 sp,vsp,分屏移动

    Vim的分屏功能 本篇文章主要教你如何使用 Vim 分屏功能. 分屏启动Vim 使用大写的O参数来垂直分屏. vim -On file1 file2 ... 使用小写的o参数来水平分屏. vim -o ...

  6. Oracle PLSQL Demo - 01.定义变量、打印信息

    declare v_sal ) :; begin --if you could not see the output in console, you should set output on firs ...

  7. 又谈C++指针(1)

    写在前面的话:虽然这段代码中对于指针的使用是不正确的,但是我却在这个不正确的代码中发现了另一个错误,而且深感迷惑,所以打算将此博文推到首页,请各位帮忙回答个问题. 在项目中用到了以下一段代码,执行结果 ...

  8. JS 计算1到1000000个自然数中有几个1的自然数?

    <script> window.onload=function(){ var   arr=[]; for(var i=1;i<1000001;i++) { var stri= i.t ...

  9. VBA学习笔记(2)--新建word文档并插入文字

    说明(2017.3.20): 1. Dim As声明变量类型,Set赋值/初始化 2. With使后面的省略对象,直接点就行,后面要End With 3. Application.StatusBar ...

  10. C# 中正则表达式 Group 分组【转】

    http://www.cnblogs.com/kiant71/archive/2010/08/14/1799799.html 在一个正则表达式中,如果要提取出多个不同的部分(子表达式项),需要用到分组 ...