我注意到libc中大多数预定义值都是使用#define指令编写的。例如,在fseek中,whence参数需要一个int,而(据我所知)枚举类型会更好。有很多类似的例子,这些例子显然存在某种原因(除了向后兼容问题)。
因此,我想知道在哪种情况下最好使用#define,而枚举是一种更易于发现的类型安全替代方案。
作为一个实际的例子,考虑一个typedef表示输入/输出通道,就像在内核中可能发生的情况一样。GPIO可以配置为输入或输出。在这里使用enum指令是否值得?
请注意,
i) 类型:
因此,我想知道在哪种情况下最好使用#define,而枚举是一种更易于发现的类型安全替代方案。
作为一个实际的例子,考虑一个typedef表示输入/输出通道,就像在内核中可能发生的情况一样。GPIO可以配置为输入或输出。在这里使用enum指令是否值得?
typedef struct gpio {
size_t port;
size_t bit;
enum { DIR_INPUT, DIR_OUTPUT } direction; // or `bool`?
bool value;
} gpio;
请注意,
enum
可以有三种不同的实现方式:i) 类型:
typedef enum gpio_direction {
DIR_OUTPUT
DIR_INPUT
} gpio_direction;
ii) 全局枚举
enum gpio_direction {
DIR_OUTPUT
DIR_INPUT
} gpio_direction;
iii) 匿名枚举(如我的示例所示)。
enum
的一个问题是枚举常量的类型总是int
,不能用于超出int
范围的值。你代码中另一个可能存在的问题是编译器(或者在理论上甚至是编译过程中)enum
大小可能会有所不同,从而影响结构体的布局。 - M.Mfseek
,但我仍然不同意你的选择。我想问的是:为什么在大多数情况下libc
使用#defines时最好使用枚举?如果你愿意,我可以重命名这个问题。 - nowox#define
经常被使用? - Hans Lub