2015-01-09 10 views
5

マルチスレッドのためにstrerror(スレッドセーフではない)を使用したLinuxコードを修正しています。私はstrerror_rstrerror_lがどちらもスレッドセーフであることを発見しました。 strerror_rの定義が異なるため(_GNU_SOURCEに応じて異なります)、新しいstrerror_l関数を使用したいのですが、どのように現在のロケールに対してlocale_tオブジェクトを取得する必要がありますか?私はiconvか何か、単純なlibcを使用していません、そして、私は "デフォルトロケール"オブジェクトを得ることができません(私はどの言語でエラーが印刷されても気にしません。 。)現在のロケールでstrerror_lを使用するには?

答えて

0

あなたはロケールパラメータ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); 
    } 
関連する問題