如何在当前语言环境中使用strerror_l?

我正在修复一些使用strerror (不是线程安全的)的multithreading的Linux代码。 我发现strerror_rstrerror_l都是线程安全的。 由于不同的定义strerror_r (取决于_GNU_SOURCE它有不同的定义)我想使用新的strerror_l函数,但我应该如何获得当前locale的locale_t对象? 我没有使用iconv或任何东西,只是简单的libc,我不明白我怎样才能获得一个“默认区域设置”对象(我不在乎什么语言的错误打印,我只是想一个人类可读的string。)

如果您将“”传递给区域设置参数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); }