《Effective C++》《杂项讨论——53、不要忽视编译器的警告》

文章目录

  • 1、term53:Pay attention to compiler warnings
  • 2、面试相关
  • 3、总结
  • 4、参考

1、term53:Pay attention to compiler warnings

许多程序员习惯性地忽略编译器警告。他们认为,毕竟,如果问题很严重,编译器应该给一个错误信息而非警告信息,不是吗?这种想法对其他语言或许相对无害,但在C++,则会出现非常严重的问题。例如:

class B {
public:virtual void f() const;
};
class D: public B {
public:virtual void f();
};

完整可编译的函数如下:

#include <iostream>  class B {  
public:  virtual void f() const {  std::cout << "B::f() const" << std::endl;  }  
};  
class D: public B {  
public:  virtual void f() {  std::cout << "D::f()" << std::endl;  }  
};  
int main() {  D d;  d.f(); // 调用 D 类中的非 const 成员函数 f()  return 0;  
}

这里希望以D::f重新定义virtual函数B::f,但其中有个错误:B中的f是个const成员函数,而在D中它未被声明为const。我手上的一个编译器于是这样说话了:

warning: D::f() hides virtual B::f()

太多经验不足的程序员对这个信息的反应是:“噢,当然,D::f遮掩了B::f,那正是想象中该有的事!”错,这个编译器试图告诉你声明于B中的f并未在D中被重新声明,而是被整个遮掩了(条款33描述为什么会这样)。如果忽略这个警告,几乎肯定导致错误的程序行为,然后是许多调试行为,只为了找出编译器其实早就侦测出来并告诉你的事情。
一旦从某个特定编译器的警告信息获得经验,你将学会了解,不同的信息意味什么——那往往和它们“看起来”的意义十分不同!尽管一般认为,写出一个在最高警告级别下也无任何警告信息的程序最是理想,然而一旦有了上述的经验和对警告信息的深刻理解,你倒是可以选择忽略某些警告信息。不管怎样说,在你打发某个警告信息之前,请定你了解它意图说出的精确意义。这很重要。
记住,警告信息天生和编译器相依,不同的编译器有不同的警告标准。所以草率编程然后依赖编译器为你指出错误,并不可取。例如上述发生“函数遮掩”的代码就可能通过另一个编译器,连半句抱怨和抗议也没有。

  • 请记住严肃对待编译器发出的警告信息。努力在你的编译器的最高警告级别下争取“无任何警告”的荣誉。
  • 不要过度依赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同。一旦移植到另一个编译器上,你原本依赖的警告信息有可能消失。

2、面试相关

(1)语法错误:
请描述一个常见的C++语法错误,并解释如何修复它。
编译器提示某个语句末尾缺少分号,你应该怎么做?
(2)类型不匹配:
当编译器报错指出类型不匹配时,通常意味着什么?
如果你尝试将一个整数赋值给一个浮点变量,会发生什么?
(3)未定义的标识符:
什么是未定义的标识符错误?它通常是由什么引起的?
如果编译器提示某个函数或变量未定义,你应该如何排查?
(4)头文件和库文件问题:
如果编译器找不到某个头文件,可能的原因是什么?
如何确保编译器能够找到外部库文件?
(5)拼写和大小写问题:
在C++中,为什么拼写和大小写很重要?
如果一个变量名的大小写在代码中不一致,会导致什么问题?
(6)链接错误:
什么是链接错误?它与编译错误有什么不同?
当链接器提示找不到某个函数的定义时,可能的原因是什么?
(7)预处理指令问题:
#include 预处理指令的作用是什么?
如果忘记包含某个必要的头文件,可能会导致什么问题?
(8)多文件项目中的编译问题:
在多文件项目中,如何确保所有文件都被正确编译?
如果一个文件依赖于另一个文件的定义,但后者没有被编译,会发生什么?
(9)编译器版本和设置问题:
不同版本的编译器可能会产生不同的结果吗?
如何检查和设置编译器的优化级别和警告级别?
(10)解决编译器报警的通用策略:
当编译器报警时,你通常会采取哪些步骤来定位和解决问题?
有没有一些通用的工具或技巧可以帮助你更快地解决编译问题?

3、总结

天堂有路你不走,地狱无门你自来。

4、参考

4.1 《More Effective C++》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一个写自定义Flume拦截器遇到的错误

先说结论&#xff1a; 【结论1】配置文件中包名要写正确 vim flume1.conf ... a1.sources.r1.interceptors.i1.type com.atguigu.flume.interceptor.MyInterceptor2$MyBuilder ... 标红的是包名&#xff0c;表黄的是类名&#xff0c;标蓝的是自己加的内部类名。这三个都…

C++RTTI(运行时类型识别)

静态类型与动态类型 当我们使用存在继承关系的类型时&#xff0c;必须将一个变量或其他表达式的静态类型与该表达式表示对象的动态类型区分开来。 表达式的静态类型在编译时总是已知的&#xff0c;它是变量声明时的类型或表达式生成的类型&#xff1b;动态类型则是变量或表计…

百度蜘蛛池平台在线发外链-原理以及搭建教程

蜘蛛池平台是一款非常实用的SEO优化工具&#xff0c;它可以帮助网站管理员提高网站的排名和流量。百度蜘蛛池原理是基于百度搜索引擎的搜索算法&#xff0c;通过对网页的内容、结构、链接等方面进行分析和评估&#xff0c;从而判断网页的质量和重要性&#xff0c;从而对网页进行…

前端学习--品优购项目

文章目录 前端学习--品优购项目1.案例铺垫文件建立与命名必备文件网站favicon图标网站TDK三大标签SEO优化常用命名 2.LOGO SEO优化3.实际代码4.申请免费域名 前端学习–品优购项目 1.案例铺垫 文件建立与命名 一个项目中为了方便实用和查找内容会有多个文件夹&#xff0c;比如…

windows10搭建reactnative,运行android全过程

环境描述 win10,react-native-cli是0.73&#xff0c;nodeJS是20&#xff0c;jdk17。这都是完全根据官网文档配置的。react-native环境搭建windows。当然官网文档会更新&#xff0c;得完全按照配置来安装&#xff0c;避免遇到环境不兼容情况。 安装nodeJS并配置 这里文档有详…

如何制作Word模板并用Java导出自定义的内容

1前言 在做项目时会按照指定模板导出word文档,本文讲解分析需求后,制作word模板、修改模板内容,最终通过Java代码实现按照模板自定义内容的导出。 2制作word模板 2.1 新建word文档 新建word文档,根据需求进行编写模板内容,调整行间距和段落格式后将指定替换位置留空。…

文件操作(随机读写篇)

1. 铺垫 建议先看&#xff1a; 文件操作&#xff08;基础知识篇&#xff09;-CSDN博客 文件操作&#xff08;顺序读写篇&#xff09;-CSDN博客 首先要指出的是&#xff0c;本篇文章中的“文件指针”并不是指FILE*类型的指针&#xff0c;而是类似于打字时的光标的东西。 打…

竞赛 python+深度学习+opencv实现植物识别算法系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的植物识别算法研究与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;4分 &#x1f9ff; 更多…

【pytest】pytest` 中几种常用的参数化方法

pytest 是一个强大的 Python 测试框架&#xff0c;它提供了多种参数化测试的方法。参数化测试允许你使用不同的输入集来运行相同的测试逻辑&#xff0c;从而确保代码在各种条件下都能正常工作。以下是 pytest 中几种常用的参数化方法&#xff1a; 1. 使用 pytest.mark.paramet…

154 Linux C++ 通讯架构实战9 ,信号功能添加,信号使用sa_sigaction 回调,子进程添加,文件IO详谈,守护进程添加

初始化信号 使用neg_init_signals(); 在nginx.cxx中的位置如下 //(3)一些必须事先准备好的资源&#xff0c;先初始化ngx_log_init(); //日志初始化(创建/打开日志文件)&#xff0c;这个需要配置项&#xff0c;所以必须放配置文件载入的后边&#xff1b;//(4)一些初…

Web应用安全攻防战:识别十大威胁,掌握防护要点

OWASP&#xff08;Open Worldwide Application Security Project&#xff09;是一家致力于应用安全威胁研究的非盈利机构。通过对超过20万个组织进行调研分析&#xff0c;该机构每三年左右就会发布一次《Web应用安全风险Top10》报告&#xff0c;这个报告已经成为全球企业开展We…

Redis入门三(主从复制、Redis哨兵、Redis集群、缓存更新策略、缓存穿透、缓存击穿、缓存雪崩)

文章目录 一、主从复制1.单例redis存在的问题2.主从复制是什么&#xff1f;3.主从复制的原理4.主从搭建1&#xff09;准备工作2&#xff09;方式一3&#xff09;方式二 5.python中操作1&#xff09;原生操作2&#xff09;Django的缓存操作 二、Redis哨兵&#xff08;Redis-Sent…

Lilishop商城(windows)本地部署【docker版】

Lilishop商城&#xff08;windows&#xff09;本地部署【docker版】 部署官方文档&#xff1a;LILISHOP-开发者中心 https://gitee.com/beijing_hongye_huicheng/lilishop 本地安装docker https://docs.pickmall.cn/deploy/win/deploy.html 命令端页面 启动后docker界面 注…

创建springboot项目的两种方式

创建springboot项目的两种方式 文章目录 创建springboot项目的两种方式一、第一种方式&#xff1a;springboot作为parent二、第二种方式&#xff1a;import 依赖管理方式三、问题1&#xff1a;无法正确打包四、问题2&#xff1a;无法执行单元测试 一、第一种方式&#xff1a;sp…

第十四章 MySQL

一、MySQL 1.1 MySql 体系结构 MySQL 架构总共四层&#xff0c;在上图中以虚线作为划分。 1. 最上层的服务并不是 MySQL 独有的&#xff0c;大多数给予网络的客户端/服务器的工具或者服务都有类似的架构。比如&#xff1a;连接处理、授权认证、安全等。 2. 第二层的架构包括…

三个表的联合查询的场景分析-场景4:c表维护a和b表的id关联关系(一对多)

基础SQL演练&#xff0c;带详细分析&#xff0c;笔记和备忘。 目录 背景介绍 表数据 需求1&#xff1a;查询g表所有记录&#xff0c;以及关联的h的id 需求2&#xff1a;在需求1基础上&#xff0c;查出关联的h的其它字段&#xff08;name&#xff09; 需求3&#xff1a;在需…

API接口开发1688阿里巴巴官方API接口按关键词采集ALIBABA商品api接入演示

要按关键词采集阿里巴巴商品&#xff0c;你需要使用1688API接口。以下是一个简单的Python示例&#xff0c;展示了如何使用requests库调用阿里巴巴API并解析返回的数据&#xff1a; # coding:utf-8 """ Compatible for python2.x and python3.x requirement: pi…

AR智能眼镜解决方案_MTK平台安卓主板硬件芯片方案开发

AR智能眼镜&#xff0c;是一个可以让现场作业更智能的综合管控设备。采用移动互联网、大数据和云计算等技术&#xff0c;现场数据的采集与分析&#xff1b;同时实现前端现场作业和后端管理的实时连动、信息的同步传输与存储。让前端现场作业更加智能&#xff0c;后端管理更加高…

项目安全性与权限管理实践与探讨

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 身份验证和授权 二. 输入验证和过滤 2.1. 添加O…

洛谷 1506.拯救oibh总部

思路&#xff1a;BFS 一道水题&#xff0c;其实就是对于flood fill的一种变形&#xff0c;我们直接用BFS就解决了&#xff0c;标志在围墙之外的0的状态&#xff0c;然后统计没有被遍历的0就行了。 上代码&#xff1a; #include<iostream> #include<stdio.h> #in…