我想消除 C 程序中所有具有区域设置相关行为的函数的使用,将它们替换为类似的函数,这些函数的行为类似于“C”区域设置中的库对应项,无论区域设置如何。
这对于使程序成为一个库来说是必要的,即使链接到调用
setlocale
的程序,该库对于所有输入始终具有相同的行为。
我们如何在 glibc 环境中让 GCC 工具链为每次调用依赖于语言环境的 C 函数生成诊断信息?
这不仅用于进行初始转换,还可以在程序中使用此类函数时立即捕获情况。
根据 C 2018 5.2.1,源字符集中和执行字符集中的扩展字符是特定于区域设置的。因此,每个使用字符的操作和函数都可能受到区域设置的影响。
<wchar.h>
和 <wctype.h>
中的所有函数都依赖于语言环境。
对于仅适用于数值并且与这些值的解释无关的操作和函数,您可能会认为它们不受影响,无论字符集中有哪些字符或它们具有什么值。例如,
'ü' - 'ö'
的结果取决于语言环境,对于包含这些字符的字符串,strcmp
也是如此,但这是 'ü'
和 'ö'
值的函数,而不是 -
的行为
或 strcmp
。
根据 5.2.2 1,书写方向是特定于语言环境的,因此理论上所有字符输出函数都会受到影响。
C 2018 标准中提到的与语言环境相关的行为的其他函数有:
mbtowc
、mbrtoc16
、mbrtoc32
(6.4.4.4 11).<ctype.h>
(7.4 2) 中的所有功能。<locale.h>
(7.11) 中的所有功能。strtod
、strtof
、strtold
(7.22.1.3 3).strtol
、strtoll
、strtoul
、strtoull
(7.22.1.4 6)。mblen
、mbtowc
、wctomb
(7.22.7 1)。mbstowcs
,wcstombs
(7.22.8 1)。strcoll
(7.24.4.3 2).strerror
(7.24.6.2 4).strftime
(7.27.3.5 3).strtoimax
、strotoumax
(7.8.2.3 通过参考其他 strto
函数定义它们)。nan
、nanf
和 nanl
(7.12.11.2 通过参考 strto
函数定义它们)。fscanf
, scanf
, sscanf
, vfsscanf
, vscanf
, vsscanf
, atof
, atoi
, atof
, atoll
(参考上述函数定义)。 依赖于实现的操作和其他不完全指定的操作可能会受到区域设置的影响。例如,指定
%p
的 fprintf
以实现定义的方式格式化指针,因此实现可能将其定义为依赖于语言环境。附件 J“可移植性问题”中列出了此类行为的候选者。