在C/C++中使用define语句和枚举语句有什么区别(与C或C++一起使用时有什么不同)?
例如,何时应该使用
enum {BUFFER = 1234};
过度
#define BUFFER 1234
Jason Cohen.. 57
enum
定义一个语法元素.
#define
是一个预处理器指令,在编译器看到代码之前执行,因此不是C本身的语言元素.
通常,优选枚举,因为它们是类型安全的并且更容易被发现.定义更难定位并且可能具有复杂的行为,例如,一段代码可以重新定义#define
另一段代码.这很难追查.
enum
定义一个语法元素.
#define
是一个预处理器指令,在编译器看到代码之前执行,因此不是C本身的语言元素.
通常,优选枚举,因为它们是类型安全的并且更容易被发现.定义更难定位并且可能具有复杂的行为,例如,一段代码可以重新定义#define
另一段代码.这很难追查.
#define
在编译器看到代码之前,语句由预处理器处理,因此它基本上是一个文本替换(实际上使用参数等更加智能).
枚举是C语言本身的一部分,具有以下优点.
1 /它们可能有类型,编译器可以对它们进行类型检查.
2 /由于它们可供编译器使用,因此可以将它们上的符号信息传递给调试器,从而使调试更容易.
Define是一个预处理器命令,它就像在编辑器中执行"replace all",它可以用另一个替换字符串,然后编译结果.
枚举是一种特殊的类型,例如,如果你写:
enum ERROR_TYPES { REGULAR_ERR =1, OK =0 }
存在一个名为ERROR_TYPES的新类型.确实,REGULAR_ERR产生为1但是从这种类型转换为int应该产生一个转换警告(如果你将编译器配置为高详细程度).
总结:它们都是相似的,但是当使用枚举时,您可以获得类型检查,并且通过使用定义,您只需替换代码字符串.
在使用枚举的任何地方,枚举通常都优先于#define:
调试器可以显示enum
s值的符号名称(" 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甚至可以让你完成智能感知代码!