分类: C/C++
2011-04-05 21:28:39
用如下代码进行测试,环境是标准YAGARTO。
unsigned char* aaa=(unsigned char*)("this is a test!"); //无警告,正确
unsigned char* bbb="this is a test!"; //pointer targets in initialization differ in signedness
signed char* ccc="this is a test!"; //pointer targets in initialization differ in signedness
char* ddd="this is a test"; //无警告,正确
puts(aaa); //pointer targets in passing argument 1 of 'puts' differ in signedness
puts(bbb); //pointer targets in passing argument 1 of 'puts' differ in signedness
puts(ccc); //pointer targets in passing argument 1 of 'puts' differ in signedness
puts(ddd);
分析如下:
第一个语句:将字符串“this is a test”强制类型转换为“unsigned char*”以便和前面定义的无符号字符型指针类型匹配。
第二个语句:定义一个无符号字符型指针,但是将字符串“this is a test”直接赋给它,此时编译器会报警告“pointer targets in initialization differ in signedness”,指针类型和初始化的时候不匹配。这个问题在老版本的GCC编译器中并没有出现,是新版才有的。
第三个语句:定义一个有符号字符型指针,但是将字符串“this is a test”直接赋给它,此时编译器也会报警告“pointer targets in initialization differ in signedness”。这说明,这个警告不是因为声明的指针的类型和后面的字符串不匹配才有的问题,而是编译器的要求比较严格,禁止将一个字符串赋值给指定了符号类型的字符型指针变量。
第四个语句:直接定义一个字符型变量,不指定是否有符号,此时将字符串“this is a test”赋值给它,编译器不会报出警告,这验证第三个语句中所作出的判断。
第五到第七个语句说明,因为puts的函数原型中参数的类型是“char”类型,所有任何其他类型参数的使用,编译器都会给出警告。