如何正确使用wctype.h函数?

jam*_*lin 5 c ctype language-lawyer

的各种is...(例如功能isalpha,isdigit)在ctype.h不完全可预测的.它们接受int参数但期望字符值在该unsigned char范围内,因此在char签名的平台上,char直接传递值可能导致不合需要的符号扩展.我认为处理这个问题的典型方法是明确地转换为unsigned char第一个.

好的,但是处理各种isw...功能的正确,便携方式是wctype.h什么? wchar_t,例如char,也可能是签名或未签名,但因为wchar_t它本身是typedef一个,类型名称unsigned wchar_t是非法的.

jam*_*lin 2

重新阅读有关 的 ISO C99 规范后wctype.h,它指出:

\n
\n

对于本子条款中描述的所有接受 type 参数的函数wint_t,该值应表示为 awchar_t或应等于宏的值WEOF。如果此参数具有任何其他值,则行为未定义。(\xc2\xa77.25.1/5)

\n
\n

将此与相应的注释进行对比ctype.h

\n
\n

在所有情况下,参数都是 an int,其值应\n表示为 anunsigned char或应等于宏的值EOF。如果参数具有任何其他值,则行为未定义。(\xc2\xa77.4/1)

\n
\n

(强调我的)

\n

我认为理解函数ctype.h需要unsigned char表示的动机也是值得的。标准要求EOF负数int(\xc2\xa77.19.1/3),因此ctype.h函数使用unsigned char表示来(尝试)避免潜在的歧义。

\n

相比之下,函数不存在这种动机wctype.h。该标准没有对 做出这样的要求WEOF,由脚注 270 详细说明:

\n
\n

宏的值WEOF可以与 的值不同EOF,并且不必为负数。

\n
\n

因为WEOF已经保证不与wchar_t(\xc2\xa77.24.1/3) 表示的任何字符冲突。

\n

因此,这些wctype.h函数没有或不需要任何无符号的废话,并且wchar_t可以直接将值传递给它们。

\n