다음 코드를 이해하고 싶습니다.
//...
#define _C 0x20
extern const char *_ctype_;
//...
__only_inline int iscntrl(int _c)
{
return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _C));
}
obenbsd 운영 체제 소스 코드의 ctype.h 파일에서 시작됩니다 . 이 함수는 문자가 제어 문자인지 또는 ASCII 범위 내의 인쇄 가능한 문자인지 확인합니다. 이것은 내 현재 생각의 사슬입니다.
- iscntrl ( 'a')이 호출되고 'a'가 정수 값으로 변환됩니다
- 먼저 _c가 -1인지 확인한 다음 0을 반환하십시오.
- 정의되지 않은 포인터가 가리키는 주소를 1 씩 증가시킵니다.
- 이 주소를 길이의 배열에 대한 포인터로 선언하십시오 (부호없는 char) ((int) 'a')
- 비트 및 연산자를 _C (0x20) 및 배열 (???)에 적용
어쨌든, 이상하게도 작동하며 0이 반환 될 때마다 주어진 char _c는 인쇄 가능한 문자가 아닙니다. 그렇지 않으면 인쇄 가능하면 함수는 특별한 관심이없는 정수 값을 반환합니다. 이해의 문제는 3, 4 단계 (5)와 5 단계입니다.
도움을 주셔서 감사합니다.
(unsigned char)
는 캐릭터가 서명되고 부정적인 가능성을 처리하는 것입니다.
_ctype_
본질적으로 비트 마스크의 배열입니다. 관심있는 캐릭터가 색인을 생성하고 있습니다. 따라서_ctype_['A']
"알파"와 "대문자"에_ctype_['a']
해당하는 비트를 포함하고 "알파"와 "소문자"에_ctype_['1']
해당하는 비트를 포함하고 "숫자"에 해당하는 비트를 포함합니다.0x20
"제어"에 해당하는 비트는 . 그러나 어떤 이유로_ctype_
배열은 1만큼 오프셋되므로 비트'a'
는 실제로 in_ctype_['a'+1]
입니다. (아마이었다가 작동하도록하기 위해EOF
추가 테스트없이도.)