printf и wprintf в одном коде C
У меня проблема при использовании printf
а также wprintf
функции вместе в коде. Если обычная строка печатается первой, то wprintf
не работает Если я использую wprintf
будет первый printf
не работает
#include <stdio.h>
#include <wchar.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL,"");
printf("No printing!\n");
wprintf(L"Printing!\n");
wprintf(L"Wide char\n");
printf("ASCII\n");
return 0;
}
Выходы:
No printing!
ASCII
В то время как
#include <stdio.h>
#include <wchar.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL,"");
wprintf(L"Printing!\n");
printf("No printing!\n");
wprintf(L"Wide char\n");
printf("ASCII\n");
return 0;
}
выходы:
Printing!
Wide char
Я использую gcc (GCC) 4.6.1 20110819 вместе с glibc 2.14 на 64-битной Linux 3.0.
2 ответа
Этого следовало ожидать; ваш код вызывает неопределенное поведение. Согласно стандарту C, каждый FILE
Поток связал с ним "ориентацию" ("байтовую" или "широкую"), которая задается первой выполненной над ним операцией и которая может быть проверена с помощью fwide
функция. Вызов любой функции, ориентация которой противоречит ориентации потока, приводит к неопределенному поведению.
В дополнение к принятому ответу Р.:
Хотя это делается очень редко, проверка кода возврата printf
/wprintf
будет более четко указывать, что один из них не работает (он должен вернуть -1 для функции печати, которая недопустима в соответствии с текущей ориентацией потока).
К сожалению, общий шаблон для проверки ошибок в стандартных функциях библиотеки:
if (wprintf(...) == -1) { perror("wprintf"); ... }
Здесь может не сильно помочь: если поток настроен на вывод неширокых символов, и вы вызываете wprintf
, errno
не может быть установлен, и вы получите wprintf: Success
, который не дает много информации.
Так что, действительно, это довольно сложная для понимания проблема, когда вы не знаете о характере ориентации потоков.