C编译warning问题

C编译warning:pointer targets in initialization differ in signedness问题  

用如下代码进行测试:

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”类型,所有任何其他类型参数的使用,编译器都会给出警告。

永不止步步 发表于01-12 10:57 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308217个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号