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是非法的.
重新阅读有关 的 ISO C99 规范后wctype.h,它指出:
\n\n对于本子条款中描述的所有接受 type 参数的函数
\nwint_t,该值应表示为 awchar_t或应等于宏的值WEOF。如果此参数具有任何其他值,则行为未定义。(\xc2\xa77.25.1/5)
将此与相应的注释进行对比ctype.h:
\n\n在所有情况下,参数都是 an
\nint,其值应\n表示为 anunsigned char或应等于宏的值EOF。如果参数具有任何其他值,则行为未定义。(\xc2\xa77.4/1)
(强调我的)
\n我认为理解函数ctype.h需要unsigned char表示的动机也是值得的。标准要求为EOF负数int(\xc2\xa77.19.1/3),因此ctype.h函数使用unsigned char表示来(尝试)避免潜在的歧义。
相比之下,函数不存在这种动机wctype.h。该标准没有对 做出这样的要求WEOF,由脚注 270 详细说明:
\n\n宏的值
\nWEOF可以与 的值不同EOF,并且不必为负数。
因为WEOF已经保证不与wchar_t(\xc2\xa77.24.1/3) 表示的任何字符冲突。
因此,这些wctype.h函数没有或不需要任何无符号的废话,并且wchar_t可以直接将值传递给它们。
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |