我正在修复一些用于strerror
(非线程安全)多线程的 Linux 代码。我发现strerror_r
并且strerror_l
都是线程安全的。由于不同的定义strerror_r
(取决于_GNU_SOURCE
它的定义不同)我想使用较新的strerror_l
函数,但是我应该如何获取locale_t
当前语言环境的对象?我没有使用iconv
或其他任何东西,只是普通的 libc,而且我看不到如何获得“默认语言环境”对象(我不在乎以什么语言打印错误,我只想要一个人类可读的字符串。 )
问问题
1192 次
2 回答
3
如果将“”传递给语言环境参数,newlocale 将分配一个设置为当前本地语言环境的语言环境对象[1]
[1] http://pubs.opengroup.org/onlinepubs/9699919799/functions/newlocale.html
static locale_t locale;
bool MyStrerrorInit(void)
{
locale = newlocale(LC_CTYPE_MASK|LC_NUMERIC_MASK|LC_TIME_MASK|LC_COLLATE_MASK|
LC_MONETARY_MASK|LC_MESSAGES_MASK,"",(locale_t)0);
if (locale == (locale_t)0) {
return false;
}
return true;
}
char * MyStrerror(int error)
{
return strerror_l(error, locale);
}
于 2015-01-15T15:29:42.263 回答
2
您可以使用POSIXuselocale
:
strerror_l(errno, uselocale((locate_t)0));
于 2021-09-18T13:47:36.187 回答