【问题标题】:How to use strerror_l with current locale?如何在当前语言环境中使用 strerror_l?
【发布时间】:2015-03-07 15:39:43
【问题描述】:

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

【问题讨论】:

    标签: c linux posix libc strerror


    【解决方案1】:

    如果将“”传递给语言环境参数,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);
    }
    

    【讨论】:

    • 您可以使用 LC_ALL_MASK 而不是 ORing 所有类别掩码
    【解决方案2】:

    你可以使用POSIX uselocale:

    strerror_l(errno, uselocale((locate_t)0));
    

    【讨论】:

    • 好吧,从技术上讲,NULL 在这里很奇怪。不是NULL,是(locale_t)0uselocale((locale_t)0)locale_t 保证是指针吗?
    • @KamilCuk 你说得对,我将uselocalesetlocale 混合在一起。我不认为locale_t 保证是一个指针,除了它在glibc 中。我已将此纳入我的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多