C语言常见的预定符号常量
C 语言提供了丰富的预定义符号常量,分布在不同头文件中,用于获取编译信息、数值范围、浮点特性等关键信息。以下是常见预定义符号常量的分类总结:
一、预定义宏(编译时信息)
由编译器自动定义,用于获取编译过程中的元信息(均以双下划线开头和结尾)。
常量名 | 描述 | 示例值 |
---|---|---|
LINE | 当前代码行号(十进制整数常量) | 42(表示第 42 行) |
FILE | 当前源文件名(字符串常量) | "main.c" |
DATE | 编译日期(格式:Mmm dd yyyy) | "Jul 22 2025" |
TIME | 编译时间(格式:hh:mm:ss) | "19:58:00" |
STDC | 编译器是否符合 ISO C 标准(1表示符合) | 1(符合时) |
STDC_VERSION | C 标准版本(如 C99 为199901L) | 199901L(C99 标准) |
STDC_HOSTED | 是否为宿主环境(1= 宿主,0= 独立环境) | 1(运行在操作系统时) |
STDC_IEC_559 | 浮点数是否符合 IEC 60559(IEEE 754)标准 | 1(符合时) |
STDC_ISO_10646 | wchar_t是否符合 ISO 10646 标准 | 201906L(2019 年修订版) |
二、整数类型范围(limits.h)
定义各整数类型的最小、最大值,避免数值溢出。
常量名 | 描述 | 典型值(32 位系统) |
---|---|---|
CHAR_BIT | char的位数 | 8(字节通常为 8 位) |
CHAR_MIN | char最小值 | -128(有符号)或0 |
CHAR_MAX | char最大值 | 127(有符号)或255 |
SCHAR_MIN | signed char最小值 | -128 |
SCHAR_MAX | signed char最大值 | 127 |
UCHAR_MAX | unsigned char最大值 | 255 |
SHRT_MIN | short最小值 | -32768 |
SHRT_MAX | short最大值 | 32767 |
USHRT_MAX | unsigned short最大值 | 65535 |
INT_MIN | int最小值 | -2147483648 |
INT_MAX | int最大值 | 2147483647 |
UINT_MAX | unsigned int最大值 | 4294967295 |
LONG_MIN | long最小值 | -2147483648(32 位) |
LONG_MAX | long最大值 | 2147483647(32 位) |
ULONG_MAX | unsigned long最大值 | 4294967295(32 位) |
LLONG_MIN | long long最小值 | -9223372036854775808 |
LLONG_MAX | long long最大值 | 9223372036854775807 |
ULLONG_MAX | unsigned long long最大值 | 18446744073709551615 |
三、浮点类型特性(float.h)
定义浮点数的精度、范围等特性,帮助处理浮点运算误差。
常量名 | 描述 | 典型值(基于 IEEE 754) |
---|---|---|
FLT_RADIX | 浮点数基数(通常为 2,二进制) | 2 |
FLT_EPSILON | float最小正数(1.0 + ε ≠ 1.0) | 1.19209290e-07 |
FLT_DIG | float有效数字位数 | 6(约 6 位十进制精度) |
FLT_MIN | float最小正值(非零) | 1.17549435e-38 |
FLT_MAX | float最大值 | 3.40282347e+38 |
FLT_MIN_EXP | float最小指数(以 2 为底) | -125 |
FLT_MAX_EXP | float最大指数(以 2 为底) | 128 |
FLT_MANT_DIG | float尾数位数(二进制) | 24(单精度 23 位 + 隐含位) |
DBL_EPSILON | double最小正数 | 2.2204460492503131e-16 |
DBL_DIG | double有效数字位数 | 15(约 15 位十进制精度) |
DBL_MIN | double最小正值 | 2.2250738585072014e-308 |
DBL_MAX | double最大值 | 1.7976931348623157e+308 |
DBL_MANT_DIG | double尾数位数 | 53(双精度 52 位 + 隐含位) |
LDBL_*系列 | long double特性(依平台而定) | 如LDBL_DIG=18(18 位精度) |
四、其他常见符号常量
在标准库中定义的通用常量,简化代码编写。
常量名 | 头文件 | 描述 | 典型值 |
---|---|---|---|
NULL | stddef.h | 空指针常量 | (void *)0 |
EOF | stdio.h | 文件结束标志 | -1 |
EXIT_SUCCESS | stdlib.h | 程序成功退出代码 | 0 |
EXIT_FAILURE | stdlib.h | 程序失败退出代码 | 1 |
五、应用场景示例
调试与日志:
printf("Error at %s:%d\n", __FILE__, __LINE__);
输出当前出错的文件名和行号,便于定位问题。
数值范围检查:
int num = 2147483648;if (num > INT_MAX) {printf("数值溢出!\n");}
避免整数溢出导致未定义行为。
浮点精度处理:
double a = 0.1, b = 0.2, sum = 0.3;if (fabs((a + b)-sum) > DBL_EPSILON) {printf("浮点运算存在误差\n");}
通过DBL_EPSILON判断浮点运算是否在误差允许范围内。
跨平台兼容性:
#if __STDC_VERSION__ >= 199901L// 使用C99特性long long val = 1234567890123LL;#else// 兼容旧标准long val = 1234567890L;#endif
根据STDC_VERSION适配不同 C 标准的特性。
总结
C 语言的预定义符号常量覆盖了编译信息、数值范围、浮点特性等关键维度,是编写健壮、可移植代码的重要工具。合理利用这些常量,可有效避免溢出、精度丢失等问题,同时提升代码的可读性和跨平台兼容性。实际开发中,应根据需求结合对应头文件(如limits.h、float.h)使用这些常量。