当前位置:  开发笔记 > 编程语言 > 正文

枚举和定义语句之间的区别

如何解决《枚举和定义语句之间的区别》经验,为你挑选了4个好方法。

在C/C++中使用define语句和枚举语句有什么区别(与C或C++一起使用时有什么不同)?

例如,何时应该使用

enum {BUFFER = 1234}; 

过度

#define BUFFER 1234   

Jason Cohen.. 57

enum 定义一个语法元素.

#define是一个预处理器指令,编译器看到代码之前执行,因此不是C本身的语言元素.

通常,优选枚举,因为它们是类型安全的并且更容易被发现.定义更难定位并且可能具有复杂的行为,例如,一段代码可以重新定义#define另一段代码.这很难追查.



1> Jason Cohen..:

enum 定义一个语法元素.

#define是一个预处理器指令,编译器看到代码之前执行,因此不是C本身的语言元素.

通常,优选枚举,因为它们是类型安全的并且更容易被发现.定义更难定位并且可能具有复杂的行为,例如,一段代码可以重新定义#define另一段代码.这很难追查.


您也可以将枚举放在命名空间中,而宏则不能.

2> paxdiablo..:

#define 在编译器看到代码之前,语句由预处理器处理,因此它基本上是一个文本替换(实际上使用参数等更加智能).

枚举是C语言本身的一部分,具有以下优点.

1 /它们可能有类型,编译器可以对它们进行类型检查.

2 /由于它们可供编译器使用,因此可以将它们上的符号信息传递给调试器,从而使调试更容易.



3> akiva..:

Define是一个预处理器命令,它就像在编辑器中执行"replace all",它可以用另一个替换字符串,然后编译结果.

枚举是一种特殊的类型,例如,如果你写:

enum ERROR_TYPES
{
   REGULAR_ERR =1,
   OK =0
}

存在一个名为ERROR_TYPES的新类型.确实,REGULAR_ERR产生为1但是从这种类型转换为int应该产生一个转换警告(如果你将编译器配置为高详细程度).

总结:它们都是相似的,但是当使用枚举时,您可以获得类型检查,并且通过使用定义,您只需替换代码字符串.



4> Simon Buchan..:

在使用枚举的任何地方,枚举通常都优先于#define:

调试器可以显示enums值的符号名称(" openType: OpenExisting",而不是" openType: 2"

您可以从名称冲突中获得更多保护,但这并不像它那样糟糕(大多数编译器都警告过它们#define.

最大的区别是你可以使用枚举作为类型:

// Yeah, dumb example
enum OpenType {
    OpenExisting,
    OpenOrCreate,
    Truncate
};

void OpenFile(const char* filename, OpenType openType, int bufferSize);

这使您可以对参数进行类型检查(您不能轻易地混合使用openType和bufferSize),并且可以轻松找到哪些值有效,从而使您的界面更易于使用.有些IDE甚至可以让你完成智能感知代码!

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有