我注意到大多数预定义值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)匿名枚举(如我的例子所示).
有很多这样的例子显然应该存在是有原因的
一个原因是没有可移植的方法来enum从汇编代码中引用C语言.低级代码通常(通常仍然是)用汇编语言编写,因此低级代码使用的常量将由a #define而不是with 指定 enum.
另一个原因是习惯用法if (verbosity & WAKE_THE_NEIGHBOURS),其中一个#defined值用于指定位位置.
所以我想知道在哪种情况下使用#define更好,而枚举是一种类型安全的替代方案,更容易被发现
在我将所有其他情况下(今-使用#define也有些传统的)使用enum,这样if (verbosity == RED)会产生一个警告(如果您使用如gcc用-Wall).
| 归档时间: |
|
| 查看次数: |
391 次 |
| 最近记录: |