虽然我们的headtail能够实现所需要的功能,但是代码难懂且长。有大段的代码是进行错误处理,使得真正的实现部分不那么明显。要解决这个问题,我们可以使用C语言的宏。

宏是预处理指令。(译注:它用来将一个标识符(宏名)定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。程序编译之前,编译的时候所有的宏名都会被定义的字符串替换,这便是宏替换)。它的功能非常强大(译注:甚至自成一门语言,有兴趣的可以参看宏编程),我们这里用其来简化代码。

宏的工作原理是定义一些参数,将这些参数复制到特定的格式(译注:宏定义)中。通过修改宏定义或者参数,宏可以生成我们想要的代码。其实我们在前面已经见过宏的定义方式,就是以#define为开头的代码片段。

这里我们定义一个LASSERT宏来帮助处理异常。通常宏名都是全大写,这样能够和C函数名区分开来。我们的宏有三个参数argsconderr。宏名定义好后,我们可以来定义如何利用这三个参数来生成代码。

  1. #define LASSERT(args, cond, err) \
  2. if (!(cond)) { lval_del(args); return lval_err(err); }

现在我们可以用新定义的宏来重写上面定义的函数了。它使得代码更易读,同时也减少敲打键盘的此书。有了这个宏,本书随后的异常处理都容易多了。