是否有理由让任何C或C ++编译器不将wctrans_t和wctype_t定义为wchar_t类型?

时间:2014-08-18 14:31:56

标签: c++ c widechar

实际上,我正在研究编程语言之间的数据类型比较,这是我在阅读C和C ++标准时遇到的问题。

引自C11,

  

wctrans_t标量类型,可以包含表示特定于语言环境的字符映射的值

     

wctype_t标量类型,可以包含表示特定于语言环境的字符分类的值

短语 标量类型 表示C11不会将wctrans_twctype_t限制为特定的标量类型。

我的GCC 4.8 of MinGW实现wctrans_twctype_t作为wchar_t的typedef,我不认为有任何其他C编译器没有将它们定义为它是。

否则有人会证明这一点,或者是否有可能发生这种情况?

2 个答案:

答案 0 :(得分:7)

我很惊讶有人将其定义为wchar_twctype_twctrans_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 !