是否有计划添加在当前语言环境下不变的C标准库字符串处理函数的版本?使用strtod strtof atof printf进行语言环境不变的字符串处理?
目前有许多易碎的解决方法,例如,从詹森/ strconv.c:
static void to_locale(strbuffer_t *strbuffer)
{
const char *point;
char *pos;
point = localeconv()->decimal_point;
if(*point == '.') {
/* No conversion needed */
return;
}
pos = strchr(strbuffer->value, '.');
if(pos)
*pos = *point;
}
static void from_locale(char *buffer)
{
const char *point;
char *pos;
point = localeconv()->decimal_point;
if(*point == '.') {
/* No conversion needed */
return;
}
pos = strchr(buffer, *point);
if(pos)
*pos = '.';
}
这些功能其进行预处理,以便输入它可以被用来独立于当前的区域设置的,假设下
- 与分隔符是一个字节
- 到
setlocale
没有呼叫这些修复功能和来电之间发生任何受影响的功能 - 该字符串可以转换之前被修改
(1)意味着在奇风异俗预处理方法断裂(参见https://en.wikipedia.org/wiki/Decimal_mark#Hindu.E2.80.93Arabic_numeral_system的例子)。 (2)意味着预处理方法不能在没有锁的情况下进行线程安全,并且该锁必须被添加到C库中。 (3)愚蠢。
如果只能将作为参数的字符串处理函数的单个调用的区域设置指定为不影响任何其他线程,则不会应用这些限制。
问题:
- 是否有解决这一缺陷WG14的任何报告或WG21?
- 如果是这样,为什么这些不被合并到标准中?这只不过是一组以功能为基础的新功能。
- 规范的解决方法是什么?
更新:
通过互联网搜索后,我发现* _l功能,在FreeBSD,GNU/Linux和MacOSX上可用。 Windows上也有类似的功能。这些解决了我的问题,但是这些不在POSIX中,这是C的超集(不是真的,POSIX放松指针)。所以问题1和2仍然是开放的。
为什么不直接在非本地化模式下运行'printf'和 - 朋友? (也就是'locale =“C”') –
@ BenVoigt。线程安全。如果我没有保持全局锁定而设置它,另一个线程进入之间。它可以将语言环境设置为其他内容,也可以使用我不想要的语言环境。 – user877329
然后你的问题是http://stackoverflow.com/q/6561723/103167的副本? –