long string literal 的类型是 long int* 吗?
Is long string literal's type long int*?
根据 this question 中的答案,像 L"test"
这样的文字具有类型 wchar_t[5]
。但是下面的 GCC 代码似乎表达了一些不同的东西:
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
数组。这里有什么问题?
wchar_t 类型不是基本类型,例如 char。它是一个实现定义的整数类型的同义词1.
1(引自:ISO/IEC 9899:201x 7.19 通用定义 2.)
wchar_t 是一个整型,取值范围可以代表所有的不同编码
支持的语言环境中指定的最大扩展字符集的成员;
根据 this question 中的答案,像 L"test"
这样的文字具有类型 wchar_t[5]
。但是下面的 GCC 代码似乎表达了一些不同的东西:
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
数组。这里有什么问题?
wchar_t 类型不是基本类型,例如 char。它是一个实现定义的整数类型的同义词1.
1(引自:ISO/IEC 9899:201x 7.19 通用定义 2.)
wchar_t 是一个整型,取值范围可以代表所有的不同编码
支持的语言环境中指定的最大扩展字符集的成员;