effective c++ 53-不要忽略编译器的警告

news/2024/11/23 23:23:14/

effective c++ 53-不要忽略编译器的警告

这一节所讲解的道理是很简单的,主要就是告诉大家要利用好编译器给出的warning信息,不要轻易忽视。但是在日常开发中,很多人都对warnging的警告不太重视。在编程方法中的很多优化方法都是将运行态的错误转移到编译态,可以如果在编译器给出的信息的重要性,因此我们不能忽略它,并且在日常开发中需要非常重视。

分析

下面将会给出一些常见的warning,并给出一些解决办法。

vector容器遍历的warning

下面是一段遍历vector容器的代码,再普遍不过的代码了。

#include <iostream>
#include <vector>int main()
{std::vector<std::string> v;v.push_back("test1");v.push_back("test2");for(int i = 0; i < v.size(); ++i){std::cout << v[i] << std::endl;}
}

此时如果采用g++ main.cpp -Wall进行编译,将报出以下的warning:

main.cpp: In function ‘int main()’:
main.cpp:9:22: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::__cxx11::basic_string<char> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]for(int i = 0; i < v.size(); ++i){

其含义是v.size()返回的是一个无符号的整形信息,而我们遍历时使用的是int i整形数据。如果vector的长度非常大,上述代码就可能出现问题。

例如下面的代码:

#include <iostream>
#include <vector>int main()
{std::vector<std::string> v;v.resize(100000);short i = 0;for(; i < v.size(); ++i){v[i] = "demo";}std::cout << "i = " << i << std::endl;
}

这里为了演示方便,使用了short而不是int,但是道理是一样的。

short的最大值是32767,这个时候再加1就变成了-32768。

而-32768(有符号)和100000(无符号)的比较是非常令人难以捉摸的,事实上-32768(有符号) 会大于100000(无符号)。因此会退出循环。

推荐修改方法:

#include <iostream>
#include <vector>int main()
{std::vector<std::string> v;v.push_back("test1");v.push_back("test2");auto len = v.size();for(size_t i = 0; i < len; ++i){std::cout << v[i] << std::endl;}
}

总结

  • 平常开发过程中,一定要重视编译器给出的警告。除非你有十足的理由,不然不要忽略任何编译器给出的warning信息。
  • 平常开发过程中还是要牢记一些开发的原则,不要完全依赖编译器, 每个编译器的warning信息并不相同。

http://www.ppmy.cn/news/82642.html

相关文章

从传统 IT 容灾转向“全栈云容灾”|什么是更适合政企的云

凌晨 3 点&#xff0c;在某医院的自助缴费机前&#xff0c;一位医患家属正愁眉紧锁&#xff0c;手中的医保卡已经刷了无数遍&#xff0c;可次次都提示缴费失败&#xff0c;至亲的手术已经迫在眉睫… 早上 8 点&#xff0c;是上班族在通勤途中打开新闻 app 刷新闻的高峰&#x…

链式二叉树OJ题思路分享

⏩博主CSDN主页:杭电码农-NEO⏩   ⏩专栏分类:刷题分享⏪   ⏩代码仓库:NEO的学习日记⏩   &#x1f339;关注我&#x1faf5;带你刷更多C语言和数据结构的题!   &#x1f51d;&#x1f51d; 链式二叉树OJ题分享 1. 前言&#x1f6a9;2. 单值二叉树&#x1f6a9;2.1 审题…

【JavaSE】Java基础语法(八)

文章目录 &#x1f353;1. 类和对象&#x1f379;&#x1f379;1.1 类和对象的关系&#x1f379;&#x1f379;1.2 类的定义 &#x1f353;2. 对象内存图&#x1f379;&#x1f379;2.1 单个对象内存图&#x1f379;&#x1f379;2.2 多个对象内存图2.3 多个对象指向相同内存图…

常见淘宝API文档接口使用攻略,一文搞定

探索淘宝数据的奥秘&#xff0c;淘宝是目前国内最大的B2C电商平台之一&#xff0c;每天都会产生海量的数据。借助淘宝API技术文档&#xff0c;我们可以轻松地获取到这些数据&#xff0c;从而为电商运营和数据分析提供有力支持。 1.什么是淘宝API&#xff1f; 淘宝API&#xf…

C++编译和链接

目录 一、源代码的组织 ①头文件&#xff08;*.h&#xff09; ②源文件&#xff08;*.cpp&#xff09; ③主程序&#xff08;main函数所在的程序&#xff09; ④从源代码到可执行文件&#xff0c;编译的过程有三大步骤&#xff1a; 1&#xff09;编译预处理 2&#xff09…

加速数实融合,数据交易3.0模式上新

数据交易市场将迎来真正的突破&#xff1f; 目前看的确如此。随着去年底“数据二十条”的颁布&#xff0c;业界普遍认为数据基础制度将加速走向落地与完善&#xff0c;数据要素化今年有望迎来全面提速&#xff0c;将极大促进数据交易市场走向规模化。 IDC预测&#xff0c;到2…

C++项目设计:构建高性能、线程安全的日志系统

C++项目设计:构建高性能、线程安全的日志系统 一、引言(Introduction)1.1 日志系统的重要性(Importance of Logging System)1.2 日志系统的基本要求(Basic Requirements of Logging System)1.2.1 高性能(High Performance)1.2.2 线程安全(Thread Safety)1.2.3 易用性…

C++ QT QDBus基操

以下是使用QDBus进行跨进程通信的具体用法&#xff1a; 1. 创建DBus服务 在服务端进程中&#xff0c;需要创建一个DBus服务&#xff0c;并注册DBus对象。示例代码如下&#xff1a; #include <QDBusConnection> #include <QDBusMessage> #include <QDBusInterf…