我想理解以下代码:
//...
#define _C 0x20
extern const char *_ctype_;
//...
__only_inline int iscntrl(int _c)
{
return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _C));
}
它起源于openbsd操作系统源代码中的文件ctype.h。此函数检查字符是否为ascii范围内的控制字符或可打印字母。这是我的当前思路:
- 调用iscntrl('a'),并将'a'转换为它的整数值
- 首先检查_c是否为-1,然后返回0,否则...
- 将未定义指针指向的地址增加1
- 将此地址声明为长度为(unsigned char)((int)'a')的数组的指针
- 将按位与运算符应用于_C (0x20)和数组(???)
谢谢任何帮助。
_ctype_
本质上是一组位掩码的数组。它由感兴趣的字符引索。因此,_ctype_ ['A']
将包含对应于 "alpha" 和 "uppercase" 的位,_ctype_ ['a']
将包含对应于 "alpha" 和 "lowercase" 的位,_ctype_ ['1']
将包含一个对应于 "digit" 的位等等。看起来0x20
是 "control" 对应的位。但由于某种原因,_ctype_
数组偏移了1,所以'a'
的位实际上在_ctype_ ['a'+1]
中。(这可能是为了让它即使没有额外的测试也能适用于EOF
) - Steve Summit(unsigned char)
的转换是为了处理字符有可能是带符号和负数的情况。 - Steve Summit