Есть ли причина для любого компилятора C или C ++ не определять wctrans_t и wctype_t как тип wchar_t?

На самом деле, я работаю над сравнением типов данных между языками программирования, и вот моя проблема при чтении стандартов C и C ++.

Цитируется из C11,

wctrans_t является скалярный тип которые могут содержать значения, которые представляют привязки символов для конкретной локали

wctype_t является скалярный тип которые могут содержать значения, которые представляют специфичные для локали классификации символов

Фраза скалярный тип указывает, что C11 не ограничивает wctrans_t а также wctype_t быть конкретным скалярным типом.

Мой GCC 4.8 из MinGW реализует wctrans_t а также wctype_t как typedef для wchar_tи я не могу думать, что у других компиляторов Си есть причина не определять их такими, какие они есть.

Может ли кто-нибудь доказать обратное или дать возможность этому случиться?

5

Решение

Я удивлен, что кто-то определил их как wchar_tни wctype_t ни wctrans_t иметь какое-либо отношение к персонажам.

Обе платформы, которые я использую, определяют их как нечто другое:

aix~$ grep wctype_t /usr/include/*h | grep typedef
/usr/include/ctype.h:   typedef unsigned int    wctype_t;

aix~$ grep wctrans_t /usr/include/*h | grep typedef
/usr/include/wctype.h:typedef wint_t (*wctrans_t)();solaris~$ grep wctype_t /usr/include/*h | grep typedef
/usr/include/wchar.h:typedef    int     wctype_t;

solaris~$ grep wctrans_t /usr/include/*/*h | grep typedef
/usr/include/iso/wctype_iso.h:typedef unsigned int      wctrans_t;
7

Другие решения

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

Wctype_t представляет характерный для локали символ классификации. Так что речь идет не о персонажах, а об их классификации (он же старый isalpha (), isalnum (), ..). Значения wctype_t используются функцией iswctype () для проверки широкого символа. Пример (C11, раздел 7.30.2.2.1):

iswctype(wc, wctype("alnum")) // iswalnum(wc)
iswctype(wc, wctype("alpha")) // iswalpha(wc)
iswctype(wc, wctype("blank")) // iswblank(wc)
iswctype(wc, wctype("lower")) // iswlower(wc)
...

Точно так же, wctrans_t представляют представляют специфичные для локали сопоставления персонажей. Таким образом, речь идет не о наборе кодов символов, а о преобразованиях широких символов одного типа в связанный тон (например, как старый toupper (), lower (), …). Отображения описаны в разделе 7.30.3 стандарта C11), вот несколько примеров:

towctrans(wc, wctrans("tolower")) // towlower(wc)
towctrans(wc, wctrans("toupper")) // towupper(wc)

Определение wchar_t, которое вы упоминаете, кажется мне вводящим в заблуждение, хотя wchar_t также является целым числом.

Вот как это определено в MSVC13:

typedef unsigned short wint_t;
typedef unsigned short wctype_t;
typedef wchar_t wctrans_t;     // yes, here too !
4

По вопросам рекламы [email protected]