原题:

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. perl的内置函数scalar

    scalar可以求数组的长度,但是,在scalar的说明里面并没有这一项. Forces EXPR to be interpreted in scalar context and returns th ...

  2. [sh]函数+条件表达式

    了解了下shell的函数和case语句: 函数格式: function(){ } 例子: function rsyncstart() { if [ "${status1}X" == ...

  3. [Golong]学习笔记(一) 基础知识

    Go编程基础 Go的内置keyword(25个) 不多 break default func interface select case defer go map struct chan else g ...

  4. SourceInsight自定义常用快捷键

    1.快速显示文件大纲,类似于eclipse中的Ctrl+O: “Options”-"Key Assignments"-"Symbol: Browse Local File ...

  5. Python 按当前日期(年、月、日)创建多级目录的方法

    先看实际效果,现在时间2018.4.26 使用python脚本按照年月日生成多级目录,创建的目录可以将系统生成的日志文件放入其中,方便查阅,代码如下: #!/usr/bin/env python #c ...

  6. Sql Server连接字符串

    SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开.          PropertyName1=Value1; ...

  7. c# 创建socket客户端

    c# 创建socket客户端 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  8. vcpkg —— VC++ 打包工具

    引用: http://www.tuicool.com/articles/aeiYz2v vcpkg 是微软 C++ 团队开发的在 Windows 上运行的 C/C++ 项目包管理工具,可以帮助您在 W ...

  9. 【C#】图像的变形/变换/扭曲。用Emgu或YLScsFreeTransform(FreeImageTransformation)或MagickImage

    需求:将图像变形,如矩形图片变换成梯形的,图素拉伸. 解决方案:目前找到有两种. 使用EmguCV,它是.Net版的OpenCV.推荐直接在VS里的Nuget中搜索EmguCV进行下载. 使用第三方库 ...

  10. [mmc]Linux下MMC/SD/SDIO的识别与操作

    转自:http://blog.csdn.net/skdkjzz/article/details/38927943 我们知道host在扫描卡的过程中,其识别的顺序为SDIO  SD MMC,并且从它的注 ...