5

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

引自 C11,

wctrans_t一种标量类型,可以保存表示特定于语言环境的字符映射的值

wctype_t一种标量类型,可以保存表示特定于语言环境的字符分类的值

短语a scalar type表示C11 不限制wctrans_t并且wctype_t是特定的标量类型。

我的 MinGW 的 GCC 4.8 实现了wctrans_tandwctype_t作为 typedef wchar_t,我认为任何其他 C 编译器都没有理由不按原样定义它们。

有人可以证明其他情况,或者提供发生这种情况的可能性吗?

4

2 回答 2

7

我很惊讶有人将它们定义为wchar_t,既与字符无关,wctype_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;
于 2014-08-18T15:02:08.723 回答
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 ! 
于 2014-08-18T17:00:58.470 回答