10

我正在修复一些用于strerror(非线程安全)多线程的 Linux 代码。我发现strerror_r并且strerror_l都是线程安全的。由于不同的定义strerror_r(取决于_GNU_SOURCE它的定义不同)我想使用较新的strerror_l函数,但是我应该如何获取locale_t当前语言环境的对象?我没有使用iconv或其他任何东西,只是普通的 libc,而且我看不到如何获得“默认语言环境”对象(我不在乎以什么语言打印错误,我只想要一个人类可读的字符串。 )

4

2 回答 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 回答