Просто сохраните текущую локаль, а затем восстановите:
void func_with_my_own_locale(void) {
const char * localesave = setlocale(LC_ALL, NULL);
assert(localesave != NULL); // or some fprintf(stderr, ....);
if (setlocale(LC_ALL, "CP437" /* or "" */) == NULL) {
assert(0);
}
......
if (setlocale(LC_ALL, localesave) == NULL) {
assert(0);
}
}
Обратите внимание, локаль является общей для всех потоков процесса, поэтому вам необходимо приостановить все остальные потоки (или убедиться, что они этого не делают).вызывать любые зависящие от локали функции) при вызове такой функции.
С posix setlocale :
После успешного завершения setlocale () должна вернуть строку, связанную суказанная категория для новой локали.В противном случае setlocale () должна возвращать нулевой указатель, а языковой стандарт программы не изменяется.
Нулевой указатель для языкового стандарта заставляет setlocale () возвращать указатель на строку, связанную с категорией для текущего языкового стандарта программы.
Строка, возвращаемая setlocale (), такова, что последующий вызов с этой строкой и связанной с ней категорией должен восстановить эту часть языкового стандарта программы.