代码之家  ›  专栏  ›  技术社区  ›  Bite Bytes

为什么枚举在C中有名称?[已关闭]

  •  0
  • Bite Bytes  · 技术社区  · 7 年前

    #include <stdio.h>
    
    
    enum fruit  {APPLE, ORANGE, BANANA};
    enum planet {EARTH, MARS, NEPTUNE};
    
    
    void foo(enum fruit f)
    {
        printf("%ld", f);
    }
    
    
    int main()
    {
        enum planet p = MARS;
    
        foo(p); /* compiler doesn't complain */
    
        return 0;
    }
    

    这有什么意义 enum
    这是我的gcc命令行:

    gcc file.c -ansi -Wall -Wextra
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   Basile Starynkevitch    7 年前

    AFAIK,在C99中,是“tag”(您所称的名称,例如。 fruit )的 enum

    所以

    enum { BLACK, RED, GREEN, BLUE, YELLOW, WHITE };
    

    可以接受(并且非常有用)

    甚至可以给出积分常数

    enum { RFCHTTP =2068, RFCSMTP= 821 };
    

    这是一种比

    #define RFCHTTP 2068
    #define RFCSMTP 821
    

    (尤其是 使用调试信息编译时,调试器知道值)

    但是在C中 枚举 大多是整数值。在C++中情况有所不同。

    %ld printf 枚举 可能是一些 undefined behavior scared gcc -Wall -Wextra 可能会警告你。

    GCC 有很多选择。阅读其章节 Invoking GCC .

    我建议(2017年)为 C99 C11

        2
  •  3
  •   AnT stands with Russia    7 年前

    即使您的代码将编译,以下内容也不会

    enum fruit *f = 0;
    enum planet *p = f;
    

    自从 enum fruit enum planet 是两种不同的不相关类型。

    隐式转换 在值上下文中的两个枚举类型之间。以完全相同的方式,可以隐式转换 double 价值到 int 类型然而,我希望你们不要用这一点得出结论,认为没有理由区分