为什么枚举在 C 中有名称?

Bit*_*tes 0 c enums c89

让我们看下面的例子:

#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;
}
Run Code Online (Sandbox Code Playgroud)

enum如果代码可以编译,那么 s 有名字有什么意义呢?
这是我的 gcc 命令行:

gcc file.c -ansi -Wall -Wextra
Run Code Online (Sandbox Code Playgroud)

Bas*_*tch 5

AFAIK,在 C99 中,“标签”(您所说的名称,例如fruitenum 是可选的。

所以

enum { BLACK, RED, GREEN, BLUE, YELLOW, WHITE };
Run Code Online (Sandbox Code Playgroud)

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

你甚至可以给出积分常数

enum { RFCHTTP =2068, RFCSMTP= 821 };
Run Code Online (Sandbox Code Playgroud)

这是比更现代的方式

#define RFCHTTP 2068
#define RFCSMTP 821
Run Code Online (Sandbox Code Playgroud)

(特别是,enum当您使用调试信息进行编译时,调试器知道这些值)

但在C中enum 大部分是整数值。C++ 中的情况有所不同。

关于使用参数的%ld格式控制转换,它可能是一些未定义的行为(所以你应该害怕)。可能会警告你。printfenumgcc -Wall -Wextra

顺便说一句,GCC有很多选择。阅读其有关调用 GCC 的章节。

我建议(2017 年)使用C99C11进行编码,而不是旧的 1989 ANSI C。