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, который не дает много информации.

Так что, действительно, это довольно сложная для понимания проблема, когда вы не знаете о характере ориентации потоков.

Другие вопросы по тегам