C++中符号常量与预处理器的行为
以头文件 climits 为例来说明,该头文件定义了符号常量来表示类型的限制。如前所述,INTMAX表示类型int 能够存储的最大值,对于 Windows7系统,为2147483 647。编译器厂商提供了 climits 文件,该文件指出了其编译器中的值。例如,在使用16位int的老系统中,climits 文件将INT MAX定义为 32 767。表3.1对该文件中定义的符号常量进行了总结,其中的一些符号常量与还没有介绍过的类型相关。
符号常量 | 表示 |
---|---|
CHAR_BIT | char的位数 |
CHAR_MAX | char 的最大值 |
CHAR_MIN | char 的最小值 |
SCHAR_MAX | signed char 的最大值 |
SCHAR_MIN | signed char 的最小值 |
UCHAR_MAX | unsigned char 的最大值 |
SHRT_MAX | short 的最大值 |
SHRT_MIN | short 的最小值 |
USHRT_MAX | unsigned short 的最大值 |
INT_MAX | int的最大值 |
INT_MIN | int 的最小值 |
UNIT_MAX | unsigned int 的最大值 |
LONG_MAX | long 的最大值 |
LONG_MIN | long 的最小值 |
ULONG_MAX | unsigned long 的最大值 |
LLONG_MAX | long long 的最大值 |
LLONGN_MIN | long long 的最小值 |
ULLONG_MAX | unsigned long long 的最大值 |
climits 文件中包含与下面类似的语句行:
#define INT MAX 3767
在 C++编译过程中,首先将源代码传递给预处理器。在这里,#define 和#include 一样,也是一个预处理器编译指令。该编译指令告诉预处理器:在程序中查找INT MAX,并将所有的INT MAX都替换为 32767。因此#define编译指令的工作方式与文本编辑器或字处理器中的全局搜索并替换命令相似。修改后的程序将在完成这些替换后被编译。预处理器查找独立的标记(单独的单词),跳过嵌入的单词。也就是说,预处理器不会将PINT MAXTM替换为 P32767IM。也可以使用#define 来定义自己的符号常量(参见程序清单 3.2)。然而,#define 编译指令是 C语言遗留下来的。C+有一种更好的创建符号常量的方法(使用关键字 const,将在后面的一节讨论),所以不会经常使用#define。然而,有些头文件,尤其是那些被设计成可用于C和C++中的头文件,必须使用#define。
对C++感兴趣的朋友点这里:C/C++课程