枚举

你或许已经注意到了,lvaltypeerr 字段的类型都是 int,这意味着它们皆由整数值来表示。

之所以选用 int,是因为我们将为每个整数值赋予意义,并在需要的时候进行解读。举例来说,我们可以制定这样的规则:

  • 如果 type 为 0,那么此结构体表示一个数字
  • 如果 type 为 1,那么此结构体表示一个错误

这是个简单而高效的方法。

但如果我们的代码中充斥了类似于 0 和 1 之类的“魔法数字”(Magic Number),程序的可读性就会大大降低。如果我们给这些数字起一个有意义的名字,就会给代码阅读者一些有用的提示,提高可读性。

C 语言为此提供了语言特性上的支持——枚举(enum)。

  1. /* Create Enumeration of Possible lval Types */
  2. enum { LVAL_NUM, LVAL_ERR };

enum 语句声明了一系列整型常量,并自动为它们赋值(译者注:从 0 开始,依次递增)。上面的代码展示了如何为 type 字段声明枚举值。

另外,我们还需要为 error 字段也声明一些枚举值。目前,我们需要声明三种类型的错误,包括:除数为零、操作符未知、操作数过大。代码如下:

  1. /* Create Enumeration of Possible Error Types */
  2. enum { LERR_DIV_ZERO, LERR_BAD_OP, LERR_BAD_NUM };