2013-11-07 2 views
2

GNU C manual говорят, что:, что ориентация стандартного вывода в C

Будучи в состоянии использовать тот же самый поток для широких и нормальных операций приходит с ограничением: поток может быть использован как для широких операций или для нормальных операций.

[...]

Важно никогда не смешивать использование широких и не широких операций на потоке. Диагностики не выдаются. Поведение приложения будет просто странным, или приложение будет просто сбой. Функция fwide может помочь избежать этого.

Я попытался на vs2012, printf затем сразу в wprintf, и простая программа работает правильно.

Тогда мой вопрос: что означает данное руководство? Когда и почему мы должны использовать функцию fwide?

+0

Какая связь между vs2012 и Gnu c? Вы используете makefile Project для вызова gcc из visual Studio? В противном случае я не понимаю ... – Constantin

+0

@ Константин, извините, это потому, что у меня нет Linux вручную. – suitianshi

ответ

0

manual говорит, более полно:

Будучи в состоянии использовать тот же самый поток для широких и обычных операций приходит с ограничением: поток может быть использован как для широких операций или для нормальной работы. Как только будет решено, путь назад невозможен. Только вызов для freopen или freopen64 может сбросить ориентацию. ориентация может быть решено тремя способами:

  • Если какой-либо из обычных функций используется символ (это включает в себя Fread и FWRITE функции) поток отмечен как не широкий ориентированным.
  • Если используется какая-либо из функций широкого символа, поток обозначается как широко ориентированный.
  • Функция fwide может использоваться для установки ориентации в любом направлении.

Важно никогда не смешивать использование широких и нешироких операций на потоке. Диагностики не выдаются. Поведение приложения будет просто странным, или приложение просто выйдет из строя. Функция может помочь избежать этого.

Обратите внимание, что документация Microsoft говорит, что их fwide() «не реализован» (это не оп) и «не соответствует стандарту.»

Мое прочтение всего этого состоит в том, что программы, использующие glibc, не должны использовать как узкие, так и широкие функции символов в одном потоке без его повторного открытия. Возможно, на платформах Microsoft таких ограничений нет; возможно, даже другие реализации libc более гибкие.

+1

Я не вижу различий между двумя цитируемыми руководствами. – zakinster

+0

@zakinster: вы правы, я удалю эту часть своего ответа.Он не должен менять основные идеи. –

+0

ОК, я попробую мой linux – suitianshi

Смежные вопросы