Является ли wchar_t просто типом unsigned short?

например, делает:

wchar_t x;

перевести на:

unsigned short x;

person Marlon    schedule 07.03.2010    source источник
comment
Марлон, ответ зависит от того, спрашиваете ли вы о C или C++. Вы хотите знать один из них или оба?   -  person sbi    schedule 07.03.2010


Ответы (6)


Короче: в C может быть, в C++ нет.

Широко. C определяет wchar_t как typedef, но в Unix это обычно 4 байта (поэтому обычно не короткое), а в Windows 2 оно может быть коротким.

В C++ это уникальный встроенный тип, такой как char или int, поэтому вы можете легально перегружать void foo(short x) и void foo(wchar_t x).

person Artyom    schedule 07.03.2010

Для всех, кто может встретить этот ответ, потому что вызовы функций в вашем проекте Visual Studio не будут связаны, несмотря на то, что обе стороны принимают wchar_t (или сопоставимый тип, например LPCTSTR с UNICODE #defined), и когда вы DUMPBIN, библиотека экспортирует функция принимает const unsigned short *, имейте в виду, что VS позволяет отключить wchar_t как встроенный тип. Если кто-то изменит это в библиотеке, и вы не нажмете тот же переключатель компилятора в своем проекте, он не будет связан.

Этот параметр можно изменить в разделе «Свойства проекта» > «C/C++/Язык/Рассматривать WChar_t как встроенный тип», его также можно изменить с помощью параметра «/Zc».

person Tim Keating    schedule 08.09.2010

Для C wchar_t является typedef. Является ли это синонимом для unsigned int, является ли он вообще беззнаковым типом или имеет размер 4 байта, определяется реализацией.

В C++ wchar_t — это отдельный встроенный тип. Здесь также его размер и подписанность определяются реализацией.

person sbi    schedule 07.03.2010

Стандарт не требует, чтобы wchar_t был беззнаковым. Его также можно подписать. И должен быть другой тип того же размера; но стандарт явно не говорит, что этот другой тип должен быть коротким.

«тот же размер, подписанность и требования к выравниванию, что и у одного из других целочисленных типов, называемых его базовым типом» (C++98 §3.9.1).

В компиляторах C это typedef, обычно определяемый в stddef.h.

person John Knoeller    schedule 07.03.2010
comment
Обратите внимание, что sizeof(wchar_t) == 2 или 4, и это зависит от платформы. Обычно только окна wchar_t имеют 16 бит. - person Artyom; 07.03.2010
comment
IIRC, AIX также имеет 16-битный wchar_t, а некоторые встроенные платформы имеют sizeof(wchar_t) == 1 - person AProgrammer; 07.03.2010

Нет, это не так. Это переводится как «широкий характер». Делать какие-либо предположения о том, что это оказывается на конкретной платформе, неверно, и в первую очередь противоречит самой цели наличия wchar_t.

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

person kyoryu    schedule 07.03.2010

Не обязательно; это может быть 4-байтовая величина или любой другой размер, выбранный реализацией.

Это зависит от компилятора.

person Jonathan Leffler    schedule 07.03.2010
comment
... но для соответствия стандартам C++ он никогда не будет typedef. - person dalle; 07.03.2010
comment
@dalle (и Артем): да, но вопрос касается typedef, поэтому он должен быть о C. Теги на самом деле опустили язык (сейчас я добавил C), но вывод ясен. - person Jonathan Leffler; 07.03.2010
comment
@Jonathan: Нет, заданный вопрос является ли wchar_t typedef. Этот тег C принадлежит вам, а не Марлону. Правильный ответ будет Да для C, но Нет для C++. - person sbi; 07.03.2010
comment
@Jonathan, я удалил тег C, потому что неясно вопрос, который он задает о C, поэтому я предполагаю, что автор должен уточнить, является ли это вопросом только C или нет. - person Artyom; 07.03.2010
comment
@Artyom: Хорошо ... Я думаю, что есть две слегка разные, но действительные интерпретации вопроса, и мы рассматриваем две разные версии. Версия 1: Является ли wchar_t определением типа, и если да, то является ли оно определением типа, эквивалентным unsigned short, что предполагают все остальные. Версия 2. Учитывая, что wchar_t является typedef, это typedef беззнакового короткого. Версия 1 допускает путаницу с C++; версия 2 - нет (потому что wchar_t не является typedef в C++, поэтому вопрос не может быть о C++). Мне казалось «очевидным», что это была версия 2; ясно, что другие считают версию 1 более правдоподобной. - person Jonathan Leffler; 07.03.2010