Chinaunix首页 | 论坛 | 博客
  • 博客访问: 682346
  • 博文数量: 109
  • 博客积分: 2033
  • 博客等级: 大尉
  • 技术积分: 1454
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-11 13:26
文章分类

全部博文(109)

文章存档

2012年(5)

2011年(104)

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


阅读(5176) | 评论(0) | 转发(0) |
0

上一篇:tcphdr结构

下一篇:快速字符串搜索算法KMP

给主人留下些什么吧!~~