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)使用這些常量。