C语言枚举的类型检查问题

在K&R的《C程序设计语言》中2.3节提到:“尽管可以声明enum类型的变量,但编译器不检查这种类型的变量中存储到值是否为该枚举到有效值。不过,枚举变量提供这种检查,因此枚举比#define更具优势。”

非常不理解。enum类型的变量枚举变量到底有什么区别?为什么前者不会检查而后者会呢?英文版如下描述:

“Although variables of enum types may be declared, compilers need not check that what you store in such a variable is a valid value for the enumeration. Nevertheless, enumeration variables offer the chance of checking and so are often better than #defines.“

还是很奇怪,后来网上看了多个帖子,终于明白了。

 

 

typedef enum months
  {
    JAN 
= 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV,DEC
  }months;

//months为枚举类型的变量
//JAN,FEB等为枚举有效值

#define Test "test" 

months m;
//m为枚举变量

int main()
{
  m 
= (months)Test; //不检查
  m = Test;//检查
}

 

 

其中,枚举类型的变量为months。枚举变量为m;

m = Test; “Test”不是一个枚举有效值,编译器检查,会报错。

= (months)Test; 把"Test"强制为months类型,months是一个枚举类型的变量,所以编译器不检查。

 (修正:之前过于纠结字词的意义,加上对于概念理解的不透彻,解释过程中犯了错误。如今再次斟酌这句话想表达的意思,应该是说,当你声明枚举变量时,编译器不必检查变量中存储的是否是合法的枚举有效值。比如m = (months)Test 将"Test"强制转换为months类型,编译器没有检查m的值是否有效。但枚举变量提供了检查的机会, m = Test 时则进行了检查。虽然这样解释还是有点模糊,但基本可以按照下面补充的内容来理解。即当类型检查通过后,则不对实际值是否有效再进行检查。检查的是类型,而不是值。)

 

/**********************2011-05-06*************************/

 

补充:

 

关于这个问题,我有去请教了我们院的“c++之父”,终于得到了正确的理解。

K&R的意思,是指编译器会check变量的赋值是否是该enum类型的,但不会check赋值本身是否合法。

 

按“c++之父”的原话 

“#define无类型检查,enum有。是否有效不管。”

“ 比如typedef enum{ ALPHA, GAMMA, BETA } EnType;”

“我声明个EnType eType = 5;  如果ALPHA = 0,那么eType是无效的。但是类型是有效的,所以编译器不会报错。”

 

所以说,我本来给的例子还是正确的,只是理解的还不够到位。“c++之父”名不虚传,一说我就懂了。 

 

 

 

 

posted @ 2011-05-03 16:05  zj27  阅读(3660)  评论(7编辑  收藏  举报