c语言常见warning的消除方法及重要性

消除编译过程中出现warning告警的重要性

在编译代码过程中,要注意对warning告警的消除,虽说一般warning是不会影响编译结果的,但是由warning引起的问题一般不好查找原因,所以在提交代码或者自己写代码的时候,一定要尽量的消除warning告警。一面以一些实例来说明消除warning告警的重要性:

  1. warning: suggest parentheses around assignment used as truth value [-Wparentheses]

这条告警作用很大:提示你在if语句中使用"="的真正意图,是想赋值还是做判断,例如下面的代码就写错了:if语句明显是想根据变量的值做一个判断,却用了"=",而宏AF_INET不等于0,导致一定会进入这个if语句的body部分。可能当时没有问题,若以后代码扩展,支持了AF_INET6地址族,就会出一些意想不到的问题。

modify before:
if(tmp_nbr->ident.address->family = AF_INET)
{
    list_ptr->nbr_ipaddr.vrfid = 0;
    list_ptr->nbr_ipaddr.family = AF_INET;
    list_ptr->nbr_ipaddr.prefixlen = tmp_nbr->ident.address->prefixlen;
    list_ptr->nbr_ipaddr.u.prefix4 = (PSP_ipv4Address_t)tmp_nbr->
                                    ident.address->u.prefix4.s_addr;
}

modify after:
if(tmp_nbr->ident.address->family == AF_INET)
{
    list_ptr->nbr_ipaddr.vrfid = 0;
    list_ptr->nbr_ipaddr.family = AF_INET;
    list_ptr->nbr_ipaddr.prefixlen = tmp_nbr->ident.address->prefixlen;
    list_ptr->nbr_ipaddr.u.prefix4 = (PSP_ipv4Address_t)tmp_nbr->
                                    ident.address->u.prefix4.s_addr;
}

2.warning: ‘xxx’ defined but not used [-Wunused-function]

static 修饰的xxx函数没有被使用到,会出现该告警。但是去掉static修饰xxx函数没有被调用,却没有此告警。说明编译器对代码区符号的属性是区分的。

1.不用static修饰函数,nm查看该函数符号在代码区,T标识是global(external)
test_static(void);
0000000000400c32 T test_static

2.static修饰函数,nm查看该函数符号在代码区,t标识是local
static test_static(void);
0000000000400c32 t test_printf

3.warning: missing braces around initializer [-Wmissing-braces]
braces : 括弧。告警的意思是初始化的时候少了括弧。明白这点,修改这个就比较容易了。具体见下面的示例:

before modify:
char sTask[][32] = {0};
after modify:
char sTask[][32] = {" ",};

4. warning: large integer implicitly truncated to unsigned type [-Woverflow]

在循环结构下,存在变量自加的情况下一定要考虑是否会溢出,否则一旦溢出,就会出现各种意想不到的情况,这种情况一定要慎重。

5.warning: multi-line comment [-Wcomment] 

需要注意注释行末尾的反斜杠,会将下一行也注释掉,如果下一行是注释的话,则没有关系;如果不是的话,则会导致注释掉有用的代码,导致异常。

/*注释行末尾的反斜杠不影响的情况*/
// this arg is a driver, for example c:\
// and you can ...


/*注释行末尾的反斜杠有影响的情况*/
#include <iostream>
#include <string>
 
#define VER_NUM "10"
 
std::string get_version_str()
{
  std::string ver("ver=");
#ifdef DEBUG
  ver += (std::string(VER_NUM) + "&debug=true");
#else // release version string...\
  ver += std::string(VER_NUM);
#endif
  return ver;
}
 
int main()
{
  std::cout<<get_version_str()<<std::endl;
  return 0;
}

该例子引用如下博文:https://blog.csdn.net/gemo/article/details/8486727

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值