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 预处理器指令、宏函数与大量新数学函数

    某些数学函数使用的宏 EDOMERANGE 定义在 <errno.h> 中,因此应包含该头文件。

    C89 中,为 floatlong double 类型保留了以 fl 为后缀的数学函数名,但只有 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

      • 下溢时返回 0errno 是否设置为 ERANGE 是实现定义的。

    C++ 注意事项:对应的标准 C++ 头文件为 <cmath>