比如:
/* open-only flags */
#define O_RDONLY 0x0000 /* open for reading only */
#define O_WRONLY 0x0001 /* open for writing only */
#define EXIT_FAILURE 1
#define EXIT_SUCCESS 0
这些定义成枚举,可读性不是更强吗
1
pursuer 2023-04-26 17:12:04 +08:00
我个人来说,一个变量可以是多组常量的组合的时候,用宏比较方便,然后就习惯用宏了
|
2
CodeCore 2023-04-26 17:39:45 +08:00
claude 的回答:
使用宏定义一组常量而不使用枚举的主要原因有: 1. 兼容性:宏定义只是简单的文本替换,可以在任何标准 C/C++中使用,而枚举是 C 语言特有的类型,在 C++中作为一种 scoped enum 使用。所以如果要确保代码在各种编译器和语言版本中都能编译通过,宏定义会更具兼容性。 2. 前向声明:对于枚举类型,在使用前必须将其定义,而宏定义可以在使用前就声明。这在 header 文件中定义常量时比较重要,可以先声明使用宏定义的常量,然后在源文件中定义具体值。 3. 类型安全:枚举有着严格的类型检查,只能用于和枚举类型兼容的场合。而宏定义只是简单替换,没有严格的类型,可以用于任何场合。这在一些特殊情况下会更灵活,但也可能引入 bug 。 4. 值的定义:枚举中的值必须是整数,而宏定义的值可以是任何文本,这在定义一些特殊常量时可能会更有用。 5. 可读性:宏定义中的值只是简单的文本替换,而不像枚举那样清晰地定义一个新类型和值。所以从可读性而言,枚举的表现会更好。 所以综上,当需要高兼容性、前向声明以及特殊值定义,可以考虑使用宏定义。其他时间优先考虑使用枚举,以获取类型安全检查、更清晰的语义和更好的可读性。也可以两者结合使用,根据具体情况选择。 |
3
blindie 2023-04-26 18:05:26 +08:00
// Type of animals
#define TIGER 0 #define CAT 1 #define HUMAN 2 与 enum animal { TIGER = 0, CAT, HUMAN } 可读性其实是差不多的。至于为啥 C 语言程序员更偏爱用宏可能是大家都在用入乡随俗?比如我就从来没在 C 里面写过枚举,没看到这个贴子之前我甚至都没想过这回事。 |
4
xtreme1 2023-04-26 18:10:54 +08:00
K&R C 一路沿袭下来的习惯吧, 枚举是 C89 的特性
|
5
icyalala 2023-04-26 18:14:04 +08:00
主要是历史原因,最初的 K&R 版本的 C 还不支持 enum 。
后来 ANSI C 也没明确 enum 的长度,而是可以由编译器决定。 另外如果常量是 flag ,需要用 or 来连接的话,用 enum 也不合适。 |
6
junyee 2023-04-26 19:27:54 +08:00
我说一点:
宏可以嵌套宏, 但是宏不能嵌套枚举常量。 |
8
artnowben 2023-04-26 21:02:32 +08:00
通常 enum 的值是从 0 开始递增的;而宏的值是可以任意的,例如按 bit 位置 1 。
例子: #define HTTP_F_CONTENT_LENGTH_AUTO 0x1 #define HTTP_F_CONTENT_LENGTH 0x2 #define HTTP_F_TRANSFER_ENCODING 0x4 #define HTTP_F_CLOSE 0x8 https://github.com/baidu/dperf/blob/main/src/http_parse.h |
9
weyou 2023-04-26 23:47:32 +08:00
@blindie 枚举类型可以 typedef 成一个类型用于变量,特别是作为函数参数, 一看就知道参数值的范围。 这种情况下可读性要比宏好的多。
|
10
LXGMAX 2023-04-27 09:25:31 +08:00
常量具有同一特征且值不需要指定:
enum JANUARY = 0, FEBRUARY, MARCH ... 反之 #define GPIOA 0x080001 #define GPIOB 0x080002 |
11
macha 2023-04-27 10:16:42 +08:00
主要还是习惯,尤其是定义错误码的时候,用枚举很变扭
|
12
nmap 2023-04-27 11:27:23 +08:00
历史传承
|
13
tomychen 2023-04-27 14:07:46 +08:00
感觉是历史遗留问题
enum 是 C89 后才有的特性 再就是,不是所有常量都是顺序的数值+1 |
14
ssw2 2023-04-27 17:57:27 +08:00
C 语言枚举有定义域的坑,用起来远不如宏定义清晰
|
15
noroot 2023-04-28 10:20:19 +08:00
看情况,现在一般情况应该是如果可以用枚举替代的话更建议用枚举,因为可以利用类型检查来规避一些错误。为什么更喜欢用宏大概是历史惯性。
|
16
noroot 2023-04-28 10:22:49 +08:00
用枚举好像存在一个这样的问题:一些项目会利用编译器的特性指定了枚举的底层大小,这时候超过这个大小的枚举值可能会 UB 。
|