c++编译器常见warning与解决方案总结 (**)

warning: no return statement in function returning non-void [-Wreturn-type]

有符号的函数,没有return。实例中bool test_bool() 没有return false或者true。根据实际情况加上就好了。

=====================================

c++编译器常见warning与解决方案总结 (**)

  https://blog.csdn.net/weixin_41093846/article/details/82284989

         编译器编译c++代码,有时候难免会有一些报警信息,不要小看这些warning,很多warning都值得注意,warning在某些情况下会引发error。能解决的warning,最好就把它搞定吧。当然大家都喜欢看到“0 warning,0 error”。

1.warning: unused parameter 'argc' [-Wunused-parameter]

    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        cout << "Hello World!" << endl;
        return 0;
    }

警告:没使用参数“XXX”。

      这个警告是在告诉程序员,参数没用上,可能是忘了用,或者本来该用的地方用错参数了,又或者这个参数根本不需要。

如果参数真的不需要又不想出现这个警告(强迫症,就是不想被警告)。可以这么做:

    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        (void)argc;(void)argv;
        cout << "Hello World!" << endl;
        return 0;
    }

    (void)argc;(void)argv;

这么写,其实是从QT学过来的,QT中有个Q_UNUSED,就是用来去除这种警告,它的含义如下:

    #define Q_UNUSED(x) (void)x;

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

    #include <iostream>
     
    using namespace std;
    bool test_bool()
    {
        return false;
    }
    int main(int argc, char *argv[])
    {
        (void)argc,(void)argv;
        bool ret;
        if( ret = test_bool() ){
            cout << "Hello World!" << endl;
        }
        return 0;
    }

    warning: suggest parentheses around assignment used as truth value [-Wparentheses]
         if( ret = test_bool() ){
                               ^

 if( ret = test_bool() )其实做了两件事。第一将test_bool()的结果赋值给ret,第二然后判断ret的bool值。

之所以会有警告,因为程序员写代码的时候,有时候没注意,会出现想表达“==”,却写成“=”的情况。

这种警告加一个括号就好了。 if( (ret = test_bool()) )

3.warning: no return statement in function returning non-void [-Wreturn-type]

    #include <iostream>
     
    using namespace std;
    bool test_bool()
    {
    }
    int main(int argc, char *argv[])
    {
        (void)argc,(void)argv;
        bool ret;
        if( (ret = test_bool()) ){
            cout << "Hello World!" << endl;
        }
        return 0;
    }

有符号的函数,没有return。实例中bool test_bool() 没有return false或者true。根据实际情况加上就好了。

4. warning: 'X::yy' will be initialized after [-Wreorder]

    #include <iostream>
     
    class BB{
     
    };
     
    class A : BB
    {
    public:
        A();
        int first;
        int second;
    };
     
    A::A() : BB()
    ,second(0)
    ,first(1)
    {
     
    }
     
    using namespace std;
    int main(int argc, char *argv[])
    {
        (void)argc,(void)argv;
        cout << "Hello World!" <<endl;
        return 0;
    }

    warning: 'A::second' will be initialized after [-Wreorder]
         int second;
             ^

这种警告真的很容易碰到。一句话--“先声明,先定义”。

 为什么会有这种警告呢?原因是这样的:

以first、second两个变量为例,first,second一次声明,如果定义second要用到first这个值,而first并没有定义,那second初始化的值就可能会有问题。比如

    second = first + 1;

    first = 2;

这样就会有问题,给予警是在提醒程序员,这里可能出现类似以上问题。

5.warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

    #include <iostream>
    #include <vector>
    using namespace std;
    int main(int argc, char *argv[])
    {
        (void)argc,(void)argv;
        vector<int>vec;
        vec.push_back(2);
        int a=1;
        if( a == vec.size() ){
            cout << "Hello World!" << endl;
        }
        return 0;
    }

    warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if( a == vec.size() )
               ^

警告:int和unsigned integer进行比较。

这种警告可以通过强转,使等号左右两边数据类型一致。

    if( (uint32_t)a == vec.size() ){

 6.warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]

    #include <iostream>
    using namespace std;
    int main(int argc, char *argv[])
    {
        (void)argc,(void)argv;
        uint32_t a=1;
        if( a<0 ){
            cout << "Hello World!" << endl;
        }
        return 0;
    }

    warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
         if( a<0 ){
              ^

 这种警告其实不常见,不过我确实在别人的代码里碰到了。无符号整型不可能小于0。
————————————————
版权声明:本文为CSDN博主「瑾修」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41093846/article/details/82284989

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值