<locale.h><locale.h>
Section outline
-
<locale.h>
– 本地化(Localization)几乎所有
struct lconv
类型的成员都已在 C89 中定义。
以下六个成员是 C99 新增的:-
int_p_cs_precedes
-
int_n_cs_precedes
-
int_p_sep_by_space
-
int_n_sep_by_space
-
int_p_sign_posn
-
int_n_sign_posn
实现还可以自行添加其他成员。
标准 C 保留了所有以
LC_
开头、后跟大写字母的宏名,用于实现自定义的区域子分类宏。标准 C 预定义的区域有两个:
-
"C"
:传统 C 区域(标准环境) -
""
(空字符串):表示本地化的原生环境
除此之外的所有区域名称字符串,其含义都是实现定义的。
C++ 注意事项:对应的标准 C++ 头文件为
<clocale>
。
区域控制(Locale Control)
setlocale
函数
如果你修改了setlocale
返回的字符串内容,其行为是未定义的。
<math.h>
– 数学运算(Mathematics)C99 引入了以下内容:
-
类型:
float_t
,double_t
-
宏:
-
FP_FAST_FMA
,FP_FAST_FMAF
,FP_FAST_FMAL
-
FP_ILOGB0
,FP_ILOGBNAN
-
FP_INFINITE
,FP_NAN
,FP_NORMAL
,FP_SUBNORMAL
,FP_ZERO
-
HUGE_VALF
,HUGE_VALL
,INFINITY
,NAN
-
错误处理相关宏:
MATH_ERRNO
,MATH_ERREXCEPT
,math_errhandling
-
-
其他:
FP_CONTRACT
预处理器指令、宏函数与大量新数学函数
某些数学函数使用的宏
EDOM
和ERANGE
定义在<errno.h>
中,因此应包含该头文件。在 C89 中,为
float
和long double
类型保留了以f
和l
为后缀的数学函数名,但只有double
类型的函数是强制实现的。从 C99 起,所有三种版本(float、double、long double)都必须提供。
关于
float
类型的函数:调用这些函数必须有相应的原型声明,否则float
类型的参数会被提升为double
。注意:即使指定了
float
类型的原型,也不一定阻止类型提升,此行为是实现定义的。
然而,要正确支持float
版本函数,提供原型声明是必要的。
数学错误处理(math_errhandling)
从 C99 开始,引入了
math_errhandling
宏,因此在某些情况下无需设置errno
。-
定义域错误(domain error):
当输入参数超出函数定义域时发生。
此时返回一个实现定义的值,并且在 C99 之前,errno
被设置为EDOM
。 -
值域错误(range error):
当结果无法用double
表示时发生:-
上溢时返回
HUGE_VAL
,符号与正确值相同。C99 之前,errno
被设为ERANGE
。 -
下溢时返回
0
,errno
是否设置为ERANGE
是实现定义的。
-
C++ 注意事项:对应的标准 C++ 头文件为
<cmath>
。 -