zoukankan      html  css  js  c++  java
  • 【C++调试】 warning: 编译警告合集

     

    warning: implicit declaration of function 'execle' [-Wimplicit-function-declaration]

    • 背景

    使用GCC编译代码时遇到以下警告:

    /home/TaskPackage/tools/kad_start_eab.c:102:2: warning: implicit declaration of function ‘execle’ [-Wimplicit-function-declaration]
      if (execle("/backupsoft/AnyBackupServer/KADService/sbin/keepalived",
          ^

    原因

    (1)缺失头文件;

    (2)函数名称错误

    参考 StackOverflow 上的讨论。 

    • 解决办法

    先用man指令查看该函数在哪个头文件下:

    man execle

    添加头文件后编译,问题解决。

    总结:编译时遇到此类warning,首先找到报警的函数,再用man查看函数的头文件并添加到代码中即可。


     

    warning: Comparison with string literal results in unspecified behaviour [-Wreorder]

    • 背景

    使用GCC编译代码时遇到以下警告:

    /Nautilus/src/tools/nautilus_tools/MetaClient/include/Timer.hpp: In member function ‘double Timer::calculate(timepoint, timepoint, const char*)’:
    /Nautilus/src/tools/nautilus_tools/MetaClient/include/Timer.hpp: 63:16: warning: comparison with string literal results in unspecified behaviour [-Waddress]
         if ("s" == timetype) {
              ^
    • 原因

    在C ++中,== 内部为原始类型(如int、char、bool...)实现,而 const char* 不是原始类型,因此const char* 和字符串会作为两个char* 比较,即两个指针的比较,而这是两个不同的指针,"s" == timetype 不可能为真。

    参考 StackOverflow 上的讨论。 

    • 解决办法

    1. 使用std::string保存字符串,通过其"==" 运算符重载比较两字符串,无需获取指针;

    2.  使用 strcmp 比较char*和const char*,字符串相等则返回0;

     


    warning:  'xxx'  will be initialized after [-Wreorder]

    • 背景

    使用GCC编译代码时遇到以下警告:

    /home/Nautilus/thriftservice/ncNautilusThriftMgmHandler.h:91:39: warning: ‘ncNautilusThriftMgmHandler::_thriftservice’ will be initialized after [-Wreorder]
         ncThriftService* _thriftservice;
    • 原因

    构造函数时,初始化成员变量的顺序要与类声明中的变量顺序相对应,若不对应,则出现如题错误。解决方法就是按照顺序进行初始化。

    对这个问题,StackOverflow上也有讨论。

     


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

    • 背景

    使用GCC编译代码时遇到以下警告:

    /home/Nautilus/thriftservice/ncNautilusThriftMgmHandler.cpp:100:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 if(iplist.size() <= reconnectCont){
                                     ^
    • 原因

    signed 和 unsigned 数据的范围不同,将无符号整数与有符号整数进行比较,会出现负的符号型的数据转化为很大的无符号型数据的现象。因为无符号整数在其极值处(即其最大值和最小值)会变得大于其有符号整数。基于此问题,编译器会发出警告。

     iplist.size() 为size_t 类型,该类型定义在 cstddef 头文件(C标准库头文件 stddef.h 的C++版)中,它是一个与机器相关的 unsigned 类型,其大小足以保证存储内存中对象的大小。在用下标访问元素时,vector使用 vector::size_type 作为下标类型,而数组下标的正确类型则是size_t。

    参考StackOverflow的讨论。

    • 解决办法

    1. 将 reconnectCont 定义为 size_t 或 size_type 类型;

    2. 将 iplist.size() 强转为 int 类型;

     


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

    • 背景

    今天在虚拟机上用GCC编译程序时,出现了下面的错误:

    make[2]: warning: Clock skew detected. Your build may be incomplete
    • 原因

    试了make clean 后再 make,仍然是同样的问题,最后发现这个错误的原因在于系统时间比文件修改时间早(此前对虚拟机修改过系统时间),系统时间是 2021-12-16 00:52:13,而文件的修改时间则是 2012-12-16 15:58:12,于是将系统时间时间修改到文件修改时间之前,再重新编译,问题解决。

    • 解决办法

    Linux下用 date 命令可查询和修改系统时间(root权限才可修改)

    1 date    查询系统时间
    2 date -s 2021-12-16   命令可以修改系统日期
    3 date -s 00:34:50     命令可以修改系统时间




  • 相关阅读:
    用于Web开发的8 个最好的跨平台编辑器
    javascript之数组操作
    15 个最佳的 jQuery 表格插件
    使用Backbone构建精美应用的7条建议
    linux内核内存分配(一、基本概念)
    redhat的systemd版本list
    Linux内核crash/Oops异常定位分析方法
    systemd bug: bz1437114 core:execute: fix fork() fail handling in exec_spawn()
    Use gdb attach pid and debug it
    Build rpm example:zram
  • 原文地址:https://www.cnblogs.com/SchrodingerDoggy/p/14313400.html
Copyright © 2011-2022 走看看