2016-08-28 4 views
4

this question의 답변에 따르면 L"test"과 같은 리터럴은 wchar_t[5]입니다. 그러나 GCC 다음과 같은 코드는 다른 것을 말할 것 같다긴 문자열 리터럴의 유형이 long int *입니까?

여기
int main() 
{ 
    struct Test{char x;} s; 
    s="Test"; // ok, char* as expected 
    s=L"Test"; // ??? I'd expect wchar_t* 
    return 0; 
} 

내가 그것을 컴파일 방법 (GCC 5.2,하지만 같은 결과는 4.5과 4.8이다) :

$ gcc test.c -o test -std=c99 
test.c: In function ‘main’: 
test.c:4:6: error: incompatible types when assigning to type ‘struct Test’ from type ‘char *’ 
    s="Test"; // ok, char* as expected 
    ^
test.c:5:6: error: incompatible types when assigning to type ‘struct Test’ from type ‘long int *’ 
    s=L"Test"; // ??? I'd expect wchar_t* 
    ^

분명히, 대신의 예상 배열 wchar_t 배열이 long int이됩니다. 여기 뭐가 잘못 됐니?

+5

리눅스에서는 wchar_t가 32 비트이지만 일부 아키텍처에서는 long int의 typedef 일 수도 있습니다. –

+1

'struct Test {} s;'는 의미가 없습니다. 구조체에는 적어도 하나의 멤버가 있어야합니다. 컴파일하는 코드를 제시하십시오. – 2501

+1

'wchar_t'는 빌트인 타입이 아닙니다. 이것은 시스템에서'long int'와 같은 형태로 구현 된 정의 된 타입입니다. 내 시스템에서, 그것은 단지 평범한 오래된 int입니다. – user3386109

답변

2

wchar_t 유형은 char과 같은 기본 유형이 아닙니다. 정수형 의 구현 정의 동의어입니다.


1 을 (: ISO/IEC 9899 :에서 인용 201x 7.19 일반적인 정의 2) 범위의 값의 최대 확장 모든 회원 고유 번호를 표현할 수있는 정수 타입이
의 wchar_t을 지원되는 로케일 중에서 지정된 문자 세트.