is...
中的各种isalpha
函数(例如isdigit
,ctype.h
)并非完全可预测。他们采用int
个参数但期望unsigned char
范围内的字符值,因此在char
已签名的平台上,直接传递char
值可能会导致不合适的符号扩展。我认为处理此问题的典型方法是先显式转换为unsigned char
。
好的,但在isw...
中处理各种wctype.h
函数的正确,可移植的方法是什么?与wchar_t
一样,char
也可以是已签名或未签名,但由于wchar_t
本身是typedef
,因此unsigned wchar_t
的类型名称是非法的。
答案 0 :(得分:2)
这不是wint_t
的用途吗? iswXxxxx()
函数采用wint_t
类型:
ISO 9899:1999在各个部分涵盖了这一点,向后工作:
§7.25宽字符分类和映射实用程序
<wctype.h>
§7.25.2.1.1iswalnum函数
概要
#include <wctype.h> int iswalnum(wint_t wc);
描述
iswalnum函数测试iswalpha或iswdigit为真的任何宽字符。
§7.24扩展的多字节和宽字符实用程序
<wchar.h>
§7.24.1简介:
wint_t
这是一个整数类型,默认情况下,参数升级不变,可以保存任何 对应于扩展字符集成员的值,以及至少一个 与扩展字符集的任何成员不对应的值(请参阅WEOF 下文); 269)
269)
wchar_t
和wint_t
可以是相同的整数类型。
'默认参数促销未更改'应该意味着它必须与int
一样大,但如果short
可能是unsigned short
或sizeof(short) == sizeof(int)
(现在很少出现这种情况,但对于某些16位系统来说确实如此)。
§7.17通用定义
<stddef.h>
wchar_t
是一个整数类型,其值范围可以表示所有的不同代码 受支持的语言环境中指定的最大扩展字符集的成员;该 null字符应具有代码值零和基本字符集的每个成员 当用作整数中的单个字符时,其代码值应等于其值 字符常量。
只要传递给iswalnum()
或其亲属的值是有效的wchar_t
或WEOF,该函数就能正常工作。如果你凭空创造了价值并设法使价值变得错误,那么就会产生不确定的行为。
答案 1 :(得分:1)
啊哈。在重新阅读关于wctype.h
的ISO C99规范时,它声明:
对于本子条款中描述的接受类型为
wint_t
的参数的所有函数,该值应表示为wchar_t
或等于宏WEOF
的值。如果此参数具有任何其他值,则行为未定义。 (§7.25.1,bullet 5)
将其与ctype.h
:
在所有情况下,参数都是
int
,其值应为。{1}} 可表示为unsigned char
或等于宏EOF
的值。如果 参数有任何其他值,行为未定义。 (§7.4,bullet 1)
(强调我的)
因此wctype.h
函数没有任何无符号的废话,我应该能够直接将wchar_t
值传递给它们。