2016-11-23 29 views
2

다음 두 프로그램의 캐스팅이 wint_twchar_t이라는 것이 표준에 맞습니까?`wint_t`와`wchar_t`로 어떻게 캐스팅합니까?

#include <locale.h> 
#include <wchar.h> 
int main(void) 
{ 
    setlocale(LC_CTYPE, ""); 
    wint_t wc; 
    wc = getwchar(); 
    putwchar((wchar_t) wc); 
} 

- wchar_t (이 가상 구현은 BMP에 한정된다) signed short이다

#include <locale.h> 
#include <wchar.h> 
#include <wctype.h> 
int main(void) 
{ 
    setlocale(LC_CTYPE, ""); 
    wchar_t wc; 
    wc = L'ÿ'; 
    if (iswlower((wint_t) wc)) return 0; 
    return 1; 
} 

wint_tsigned intWEOF == ((wint_t)-1)이다의 경우를 고려한다. 그런 다음 (wint_t)U+FFFFWEOF과 구별 할 수없는 입니다. 예, U+FFFF은 예약 된 코드 포인트이지만 은 여전히 ​​충돌하는 것은 잘못되었습니다.

실제 구현에서는 결코 실현되지 않는다고 맹세하고 싶지 않습니다. 기존 구현에 대한 철저한 감사.

wchar_t 정확하게 BMP를 설명 할 수없는, 기술 환경에 또한 May wchar_t be promoted to wint_t?

+0

wint_t에 대한 언급이 없습니다. – gnasher729

답변

1

참조 : 그 형태가 wchar_t 동등한 부호 같이 L'\uFEFF'wchar_t의 범위를 초과합니다. (C11 6.4.4.4 문자 상수 p9). 이 값을 wchar_t으로 저장하면 signed short으로 정의되며 16 비트 단락이라고 가정하면 값이 변경됩니다. 한편

소스 코드에 사용되는 캐릭터는 유니 코드 컴파일러가 제대로 올바르게 인코딩을 분석하도록 구성되는 경우, L'ÿ' 부호없는 타입 값 255가 있으므로 두 번째 예에서는 코드가 완벽하다 정의되고 모호하지 않습니다. int 32 비트 폭 short 16 비트 폭의 경우

, 그것은 훨씬 더 일관성있는 int 또는 unsigned short 중 하나로 wchar_t을 정의하는 것 같다. WEOFwchar_t의 모든 값과 다른 값 또는 적어도 유니 코드 코드 포인트를 나타내는 모든 값으로 정의 할 수 있습니다.

+0

'(-1)'을'unsigned short'로 반환하는 것은 유니 코드에서 유효한 문자가 될 0xFFFF와 같습니다. 아니면 무언가를 잊어 버렸습니까? –

+0

중간 단락에 UTf-8과 codepoint를 혼동 한 것 같습니다. UTF-8에서는 8 진수 255가 유효하지 않으며 UTF-8의'L' î '는 C3 BF의 두 옥텟으로 인코딩됩니다. –

+0

@PeteKirkham : 명확하고 적절하게 구성되어있는 한 명확한 설명, 문자 세트 및 파일 인코딩은 2 가지 다른 문제이므로 인코딩에 대해서는 신경 쓰지 않습니다. – chqrlie