BSD 和 macOS Sierra(以及之前的 Mac OS X)支持_l
允许您指定区域设置的函数,而不是依赖于当前区域设置。例如:
int
fprintf_l(FILE * restrict stream, locale_t loc, const char * restrict format, ...);
int
printf_l(locale_t loc, const char * restrict format, ...);
int
snprintf_l(char * restrict str, size_t size, locale_t loc, const char * restrict format, ...);
int
sprintf_l(char * restrict str, locale_t loc, const char * restrict format, ...);
and:
int
fscanf_l(FILE * restrict stream, locale_t loc, const char * restrict format, ...);
int
scanf_l(locale_t loc, const char * restrict format, ...);
int
sscanf_l(const char * restrict str, locale_t loc, const char * restrict format, ...);
作为一般设计,这似乎是明智的。方式locale_t
不是标准 C 的一部分,而是 POSIX 的一部分(并在<locale.h>
那里),并用于<ctype.h>
除其他地方外。 BSD 手册页说要使用的标头是<xlocale.h>
而不是<locale.h>
;这也许可以通过标准来解决。除非 BSD 函数的设计存在重大缺陷,否则这些应该是任何标准化工作的良好基础,无论是在 POSIX 还是标准 C 下。
BSD 设计的一个问题可能是locale_t
结构是按值传递的,而不是按(常量受限的)指针传递的,这有点令人惊讶。然而,它与 POSIX 函数一致,例如:
int isalpha_l(int, locale_t);
也可以设计类似的方案来处理时区设置。由于还没有时区类型(而locale_t
已经是 POSIX 的一部分——并且可能无需更改为标准 C)就可以被采用。但是,与区域设置相结合,它可以使时间例程更容易通过单个可执行文件在不同的环境中使用。