使用枚举定义单个值的优势?(C)

使用枚举定义单个值的优势?(C),c,c-preprocessor,C,C Preprocessor,最近,在中,我看到了一个用于定义单个值的枚举。例如: enum { BITS_PER_WORD = 32 }; 而不是: #define BITS_PER_WORD 32 假设以后不会增加更多成员,那么这样做的好处是什么?(或者这更像是个人品味的问题) 换言之,如果我有使用一次性int定义的现有代码,是否有充分的理由对上面显示的一次性枚举进行更改 出于好奇,我将GCC的优化汇编程序输出与一些非平凡代码进行了比较,结果在enum/defines之间没有变化。一个优点是enums的作用域是有限的

最近,在中,我看到了一个用于定义单个值的枚举。例如:

enum { BITS_PER_WORD = 32 };
而不是:

#define BITS_PER_WORD 32
假设以后不会增加更多成员,那么这样做的好处是什么?(或者这更像是个人品味的问题)

换言之,如果我有使用一次性int定义的现有代码,是否有充分的理由对上面显示的一次性枚举进行更改


出于好奇,我将GCC的优化汇编程序输出与一些非平凡代码进行了比较,结果在enum/defines之间没有变化。

一个优点是
enum
s的作用域是有限的,您可以在块内定义
enum
。宏也会扩展,例如:

foo.BITS_PER_WORD;
甚至

void foo(int BITS_PER_WORD) { /* ... */ }

宏的一个优点是,您可以将其定义为非-
int
值。

枚举常量有几个优点:

  • 它们是有范围的,不会在不应该扩展的上下文中扩展(正如mafso所指出的)
  • 大多数调试器都知道它们,并且可以在调试器中编写的表达式中使用它们
宏有几个不同的优点:

  • 它们可以在预处理器条件中使用(
    \if BITS\u PER\u WORD==32
    如果
    BITS\u PER\u WORD
    是一个枚举常量,则它们将不起作用)
  • 它们可以有任意类型(mafso的答案中也包括)
  • 当不再需要时,可以删除它们(
    #undef

在第一种情况下,编译器会看到每个字的
位,并将其等同于32位(除非有阴影)。第二个是32。可能是@Eitan T的重复,很接近,但不认为是重复,主要是因为我问的是单个值,而不是哪个更好。但是对于使枚举不易出错的特定语言特征(例如),我不确定这种细微的差异是否可以作为单独问题的理由(您的查询可以通过在更广泛的问题或其答案中添加注释来完成)。正如您所看到的,答案没有特别提供新的信息。添加了澄清(问题结束),我认为这有点区别于一般定义vs enum问题。仅供参考,范围不是
#define
的问题。它适用于它后面的代码,因此如果要限制它的范围,只需
#undef
它即可。@EitanT:如果您仍在使用的其他宏依赖于您将要取消定义的宏,然后停止工作,则可能会出问题。它也可能是一个维护负担,因为在包含
“foo.h”
之后,您必须知道如何
#undef
以防止它破坏您的代码,并且该宏集不断变化(或者,如果它是一个不遵守标准命名空间规则的系统头,则会随着系统的变化…).我没说这不会是一个维护负担。我刚刚指出,使用宏可以克服范围的限制。应该注意的是,在标准中,所有命名常量都是使用宏创建的(对于其中一些常量,这是强制性的,因为它们的类型不同于
int
true
false
int
来自
stdbool.h
的值都是显式的宏,我认为原因是允许程序员重新定义它们(使用
#undef
)。@ouah:很好。事实上,我认为在预处理器中使用它们的能力是最重要的部分之一,因为它们不仅需要是宏,还需要在预处理器中使用时提供正确的结果(例如
(char)+256
将是在大多数实现中写入零的一种方式,但它在预处理器级别的值是错误的)。