На самом деле, я работаю над сравнением типов данных между языками программирования, и вот моя проблема при чтении стандартов C и C ++.
Цитируется из C11,
wctrans_t
является скалярный тип которые могут содержать значения, которые представляют привязки символов для конкретной локали
wctype_t
является скалярный тип которые могут содержать значения, которые представляют специфичные для локали классификации символов
Фраза скалярный тип указывает, что C11 не ограничивает wctrans_t
а также wctype_t
быть конкретным скалярным типом.
Мой GCC 4.8 из MinGW реализует wctrans_t
а также wctype_t
как typedef для wchar_t
и я не могу думать, что у других компиляторов Си есть причина не определять их такими, какие они есть.
Может ли кто-нибудь доказать обратное или дать возможность этому случиться?
Я удивлен, что кто-то определил их как 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;
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 !