【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     命令可以修改系统时间




原文地址:https://www.cnblogs.com/SchrodingerDoggy/p/14313400.html