实际上,我正在研究编程语言之间的数据类型比较,这是我在阅读C和C ++标准时遇到的问题。
引自C11,
wctrans_t
是标量类型,可以包含表示特定于语言环境的字符映射的值
wctype_t
是标量类型,可以包含表示特定于语言环境的字符分类的值
短语 标量类型 表示C11不会将wctrans_t
和wctype_t
限制为特定的标量类型。
我的GCC 4.8 of MinGW实现wctrans_t
和wctype_t
作为wchar_t
的typedef,我不认为有任何其他C编译器没有将它们定义为它是。
否则有人会证明这一点,或者是否有可能发生这种情况?
答案 0 :(得分:7)
我很惊讶有人将其定义为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;
答案 1 :(得分:4)
Cubbi已经回答了这个问题。这里有一些额外的信息,因为标准的定义并不是真正的自我解释。
wctype_t表示特定于语言环境的字符 分类 。所以它不是关于角色,而是关于它们的分类(也就是旧的isalpha(),isalnum(),...)。函数iswctype()使用wctype_t值来测试宽字符。示例(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(),...)。映射在C11标准的7.30.3节中描述),这里有一些例子:
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 !