在枚举之间选择还是在C中定义?

now*_*wox 7 c enums casting

我注意到大多数预定义值libc都是使用#define指令编写的.例如,whence参数取一个intin fseek(从我的知识)一个enum会更好.有很多这样的例子显然应该出于某种原因(除了后兼容性问题).

所以,我想知道在这种情况下是它更好地使用#define,而enum类型安全的替代方案更容易被发现.

作为一个实际例子,考虑typedef表示输入/输出通道,因为它可能是内核的情况.gpio可以在输入或输出中配置.enum在这里使用指令是否值得?

typedef struct gpio {
    size_t port; 
    size_t bit;
    enum { DIR_INPUT, DIR_OUTPUT } direction; // or `bool`?
    bool value;
} gpio;
Run Code Online (Sandbox Code Playgroud)

请注意,enum可以通过三种不同的方式实现:

i)类型:

typedef enum gpio_direction {   
   DIR_OUTPUT
   DIR_INPUT
} gpio_direction;
Run Code Online (Sandbox Code Playgroud)

ii)全球枚举

enum gpio_direction {   
   DIR_OUTPUT
   DIR_INPUT
} gpio_direction;
Run Code Online (Sandbox Code Playgroud)

iii)匿名枚举(如我的例子所示).

Han*_*Lub 5

有很多这样的例子显然应该存在是有原因的

一个原因是没有可移植的方法来enum从汇编代码中引用C语言.低级代码通常(通常仍然是)用汇编语言编写,因此低级代码使用的常量将由a #define而不是with 指定 enum.

另一个原因是习惯用法if (verbosity & WAKE_THE_NEIGHBOURS),其中一个#defined值用于指定位位置.

所以我想知道在哪种情况下使用#define更好,而枚举是一种类型安全的替代方案,更容易被发现

在我将所有其他情况下(今-使用#define也有些传统的)使用enum,这样if (verbosity == RED)会产生一个警告(如果您使用如gcc-Wall).