1 预处理器方式
头文件climits定义了符号常量,包含与下面类似的语句行:
#define INT_MAX 32767 //没有分号哦
#define myFunc x(x-1)
在C++编译过程中,首先将源代码传递给预处理器。这里#define和#include一样,是一个预处理器编译指令。
- #define指令的工作方式与文本编辑器或字处理器中的全局搜索并替换命令相似,即找到myFunc并替换为x(x-1)。
- 修改后的程序将在完成这些替换后被编译。
- 预处理器查找独立的标记(即单词),跳过被嵌入的单词,即不会处理PINT_MAXU中的INT_MAX。
- 也可以使用#define定义自己的符号常量。
- #define是C遗留下来的,有些头文件,尤其是被设计成可用于C和C++的,必须使用#define。
2 const限定符
const常量被初始化后,其值就被固定了,编译器不再允许修改该常量的值。
const typename = value;
应在声明中对const进行初始化,下面的代码不好:
const int toes;
toes = 10; //太迟了
如果用const声明常量时没有提供值,则该常量的值将是不确定的,且无法修改。
区分常量有一些常见的约定:
- 将名称的首字母大写,以提醒这是个常量。这样有助于区分变量和常量。
- 使用#define创建常量时通常将整个名称大写。
- 以字母k打头。
- 其他约定。
const声明相比于#define语句的优点:
- const能够明确指定类型。
- const可以用C++的作用域规则将定义限定正在特定的函数或文件中。
- 可以将const用于更复杂的类型,如数组和结构。
ANSI C也使用const限定符,由C++借鉴而来。但两者有区别:
- 作用域规则不同。
- 在C++中还可以用const声明数组长度。
3 enum枚举常量
C++的enum工具提供了一种创建符号常量的方式,可以代替const。它允许定义新类型,但有严格限制。
使用enum的句法与使用结构struct相似。
- 让spectrum成为新类型的名称,spectrum被成为枚举(enumeration),就像struct变量被成为结构一样。
- 将red、orange等作为符号常量,即枚举量。
- 默认情况下,将整数值赋给枚举量,第一个枚举量值为0,第二个为1,依次类推。可通过显示地指定整数值来覆盖默认值。
- 可以用枚举名来声明这种类型的变量。
- 若打算只用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称。
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet}; //定义
spectrum band; //声明
enum {red, orange, yellow, green, blue, violet, indigo, ultraviolet}; //定义,只用常量
具体请参考:枚举类型[C++]。