Linux编译警告的解决办法

本文介绍了如何在Linux中编译时启用详细错误和警告信息,以帮助开发者更严格地检查程序,使用编译选项-Wall -Werror将警告视为错误进行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、warning: cast from pointer to integer of different size
1).while((sp < 256) && (src[sp] != NULL))
->while((sp < 256) && (src[sp] != '\0'))
2).dest[dp] = NULL;
   dest[dp] = '\0';
为了测试字符串的实际长度,C语言规定了字符串结束标志'\n';'\n'代表ASCII码为0的字符,它不是一个可以显示
的字符,而是一个空操作符,只作为一个辨别的标志。
二、warning: dereferencing type-punned pointer will break strict-aliasing rules

in file CSTFlowControl.c:
STAT_FC_STREAMING_FCSTATUS_EX * pMsg;
STREAM_PACKET strPkt;
pMsg = (STAT_FC_STREAMING_FCSTATUS_EX *)&strPkt;
when running C:\WindRiver\gnu\4.1.2-vxworks-6.6/x86-win32/bin/ccmips
(gcc version 4.1.2 (Wind River VxWorks G++ 4.1-82))
get warning: dereferencing type-punned pointer will break strict-aliasing rules
solution:
pMsg = (STAT_FC_STREAMING_FCSTATUS_EX *) (int32)&strPkt;
explanation:
convert the address of strPkt to an integer, then convert this integer to an pointer to struct (STAT_FC_STREAMING_FCSTATUS_EX
you should confirm that the conversion between those two data type is legal.


refer to:
我们已经知道,指针的值就是指针指向的地址,在32位程序中,指针的值其实是一个32位整数。那可不可以把一个整数当作指针的值直接赋给指针呢?就象下面的语句: 
unsigned int a; 
TYPE *ptr;//TYPE是int,char或结构类型等等类型。 
... 
... 
a=20345686; 
ptr=20345686;//我们的目的是要使指针ptr指向地址20345686(十进制) 
ptr=a;//我们的目的是要使指针ptr指向地址20345686(十进制) 
编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到了吗?不,还有办法: 
unsigned int a; 
TYPE *ptr;//TYPE是int,char或结构类型等等类型。 
... 
... 
a=某个数,这个数必须代表一个合法的地址; 
ptr=(TYPE*)a;//呵呵,这就可以了。 
严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样。这里的(TYPE*)的意思是把无符号整数a的值当作一个地址来看待。 
上面强调了a的值必须代表一个合法的地址,否则的话,在你使用ptr的时候,就会出现非法操作错误。 
想想能不能反过来,把指针指向的地址即指针的值当作一个整数取出来。完全可以。下面的例子演示了把一个指针的值当作一个整数取出来,然后再把这个整数当作一个地址赋给一个指针: 
例十六: 
int a=123,b; 
int *ptr=&a; 
char *str; 
b=(int)ptr;//把指针ptr的值当作一个整数取出来。 
str=(char*)b;//把这个整数的值当作一个地址赋给指针str。 
好了,现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以把一个整数值当作地址赋给一个指针。

三、使编译时显示详细的错误/警告信息的编译选项是什么?

对程序要求严格的话可以用 -Wall -Werror

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值