枚举如何处理未定义的值?

时间:2017-08-02 09:00:24

标签: c enums

typedef enum {my_false, my_true = 5, my_maybe = 3} my_bool;

my_bool f(){return 2;}
int g(){return my_true;}

int main (){
    my_bool mb = f();
    int i = f();
    printf("%d--%d\n", mb==i, mb);

    mb = g();
    i = g();
    printf("%d--%d\n", mb==i, mb);

    return 0;
}

函数返回enum时会发生什么?

正如我所看到的,在我的代码中,f()可以返回任何数字,即使它未在my_bool enum中定义,但似乎无论我返回什么(如在我的示例中2my_bool mb = f();中存储的值为1,除非我返回0my_false

  1. 这是应该发生的事吗? enum会立即衰减到int 因此,没有在其中定义的数字没有问题?

  2. 为什么gcc会生成警告:comparison between signed and unsigned integer expressions [-Wsign-compare]... printf("%d--%d\n", mb==i, mb);?不是enum一个signed int

  3. 为什么用不同的标识符定义相同的值? (即typedef enum {xx = 1, yy = 1} zz;

2 个答案:

答案 0 :(得分:2)

枚举可以在其范围内取任何值。范围由表示所有枚举器所需的位定义。在您的情况下,my_true需要3位,其范围为0-7。

枚举器本质上是命名常量,并且没有理由不能使两个常量碰巧具有相同的值。很多常数实际上都是零。

答案 1 :(得分:0)

枚举可以实现为charintunsigned int,并留待实施。从警告中,您可以获得gcc编译器实现unsigned int

的信息