【问题标题】:Advantages in using an enum to define a single value? (C)使用枚举定义单个值的优势? (C)
【发布时间】:2014-07-29 14:28:44
【问题描述】:

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

enum { BITS_PER_WORD = 32 };

代替:

#define BITS_PER_WORD 32

假设以后不会添加更多成员,那么这样做的好处是什么(如果有的话)? (或者这更多是个人品味的问题)

换句话说,如果我有使用一次性 int 定义的现有代码,是否有充分的理由为上面显示的一次性枚举更改这些?

出于好奇,我比较了一些非平凡代码的 GCC 优化汇编器输出,结果在枚举/定义之间没有变化。

【问题讨论】:

  • 在第一种情况下,编译器看到BITS_PER_WORD 并将其等同于 32(除非有什么影响)。它在第二个看到 32。
  • @Eitan T,它很接近但不认为它是重复的,主要是因为我问的是单个值而不是哪个更好。但是对于使枚举不易出错的特定语言特征(例如)。
  • 嗯,我不确定这种微小的差异是否能证明一个单独的问题(您的询问可以通过在更广泛的问题或其中一个答案中的评论来完成)。如您所见,答案没有提供特别的新信息。
  • 添加了澄清(问题结束),我认为这与一般定义与枚举问题有所不同。

标签: c c-preprocessor


【解决方案1】:

枚举常量有几个优点:

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

宏有几个不同的优点:

  • 它们可用于预处理器条件(如果BITS_PER_WORD 是枚举常量,#if BITS_PER_WORD == 32 将不起作用)。
  • 它们可以有任意类型(mafso 的回答中也有介绍)。
  • 可以在不再需要时将其删除 (#undef)。

【讨论】:

  • 应该注意的是,在标准中所有命名常量都是使用宏创建的(其中一些是强制性的,因为它们的类型不同于int)。来自stdbool.htruefalse int 值是明确的宏,我认为原因是允许程序员重新定义它们(使用#undef)。
  • @ouah:好点。实际上,我认为在预处理器中使用它们的能力是最重要的部分之一,因为它们不仅需要是宏,而且还需要在预处理器中使用时给出正确结果(例如(char)+256 将是在大多数实现上写零的方式,但在预处理器级别会有错误的值)。
【解决方案2】:

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

foo.BITS_PER_WORD;

甚至

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

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

【讨论】:

  • 仅供参考,#define 的范围不是问题。它适用于它后面的代码,所以如果你想限制它的范围,只需#undef它。
  • @EitanT:如果您仍在使用的其他宏依赖于您即将取消定义并随后停止工作的宏,这可能会成为问题。这也可能是一个维护负担,因为在包含"foo.h" 之后,您必须知道#undef 以防止它破坏您的代码,并且该宏集不断变化(或者,如果它是一个不尊重标准命名空间规则,从系统到系统的变化......)。
  • 我没有说这不会是维护负担。我刚刚指出,您可以克服宏的作用域限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多