【发布时间】:2014-10-28 22:56:52
【问题描述】:
我认为可以肯定地说 C 语言环境被普遍认为是一个坏主意。
如果您必须考虑将语言环境设置为与"C" 不同的任何内容,那么使用 C 标准库函数编写一个尝试解析或编写基于文本的机器格式(这种情况经常发生)的应用程序几乎是不可能的。由于语言环境通常是每个进程的(并且setlocale 通常不是线程安全的),如果您正在编写一个库或者您有一个多线程程序,那么即使执行setlocale(LC_ALL, "C") 并在完成您的工作后恢复它也是不安全的。
现在,由于这些原因,规则通常是“避免setlocale,句号”; 但是:过去我们曾多次被QCoreApplication 和派生类的特殊行为所困扰; documentation 说:
在 Unix/Linux 上,Qt 默认配置为使用系统区域设置。这可能会在使用 POSIX 函数时引起冲突,例如,在浮点数和字符串等数据类型之间进行转换时,因为不同语言环境的表示法可能不同。要解决此问题,请在初始化
QApplication或QCoreApplication后立即调用 POSIX 函数setlocale(LC_NUMERIC,"C")以将用于数字格式化的语言环境重置为“C”-locale。
此行为已在another question 中描述;我的问题是:这种显然愚蠢的行为的基本原理是什么?尤其是 Unix 和 Linux 有什么特别之处,才促使做出这样的决定只在这些平台上进行?
(顺便说一句,如果我在创建QApplication 之后只执行setlocale(LC_ALL, "C");,一切都会中断吗?如果没问题,他们为什么不直接删除他们的setlocale(LC_ALL, "");?)
【问题讨论】:
-
在 linux 范围内的 char 函数(例如:wcstok)上有一个额外的参数来保证多线程安全。 QT 肯定会在 linux 上使用标准的 libc 宽字符函数...
标签: c++ linux qt localization