2016-08-28 3 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

Но на Linux wchar_t 32 бит, в некоторых архитектурах это может быть просто typedef для long int. –

+1

'struct Test {} s;' не имеет смысла. Структуры должны иметь хотя бы одного члена. Представьте код, который компилируется. – 2501

+1

'wchar_t' не является встроенным. Это определенный тип реализации, который оказывается эквивалентным 'long int' в вашей системе. В моей системе это просто простой «int». – user3386109

ответ

2

Тип wchar_t не является фундаментальным типом, как char. Это синоним, определяемый реализацией целочисленного типа .


(Цитируется: ИСО/МЭК 9899: 201x 7,19 Общие определения 2.)
wchar_t, который является целым числом, тип которого диапазон значений может представлять различные коды для всех членов самой большой расширенной набор символов, указанный среди поддерживаемых локалей;