Sto correggendo del codice Linux che utilizzava strerror
(non thread-safe) per il multi-threading. Ho trovato che strerror_r
e strerror_l
sono entrambi thread-safe. A causa delle diverse definizioni per strerror_r
(a seconda di _GNU_SOURCE
è diversamente definito) Vorrei utilizzare la più recente funzione strerror_l
, ma come dovrei ottenere un oggetto locale_t
per le impostazioni internazionali correnti? Non sto usando iconv
o nulla, semplicemente libc, e non vedo come posso ottenere un oggetto "locale predefinito" (non mi interessa in quale lingua viene stampato l'errore, voglio solo una stringa leggibile dall'uomo .)Come usare strerror_l con le impostazioni locali correnti?
5
A
risposta
0
Se passate "" per il parametro locale newlocale assegnerà un oggetto locale impostato per il locale nativo corrente [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);
}