2010-09-13 100 views

回答

3
  • 符号常数(与#define):在定义点不检查。在文本替换之后,在使用点进行正常检查。可用于任何基本类型的常量(在C99中,即使对于非基本类型)

  • 枚举:只能保存整数,并在定义点检查。

  • const -qualified变量:在C中不是真正的常量,但应该被视为“只读”变量。因为它不是一个常数,所以这些不能用在语言要求不变的地方。

应假定变量(即使它们是“只读”)会占用内存。可以假设枚举器和#define可以产生直接插入代码中的常量值。在实际情况下,实际情况还取决于常量类型和CPU处理这些常量的能力。

就类型安全而言,没有太大的差别。除非编译器会尝试使用非整数初始化枚举器,否则会更大声地抱怨。

实际上,枚举最常用于紧密相关的整数常量组,而#define则用于其他所有内容。

+0

为了补充说明,枚举还可以允许一些调试器显示枚举常量的名称而不是数值。此外,如果可以确定永远不会计算其地址(这将是一个优化选项,而不是默认行为),则某些编译器可以将'const'限定的变量视为符号常量。 – bta 2010-09-13 18:07:35

0

我会亲自选择枚举 - >给你声明常量的能力,并且仍然可以使用如下构造:XmlStatusesEnum :: XML_FILE_OK。

1

符号常量得到一些类型检查,通常是一个编译器会告诉你,如果一个常数过大,以适应在你为它分配

枚举常量得到任何类型的所有检查,因为他们只是int的地方。与枚举类型变量可能会得到某种类型和范围检查相反。

有没有像恒定变量这样的事情,你可能意味着const合格变量。这些是类型安全的,是的,但并不是常量在C如何理解单词常量。把它们看作unmutableinvariant

C中的常量不占用任何空间,它们只是编译过程中需要的符号值,在执行过程中没有对应的对象。