当前位置: 首页 > news >正文

C++——编程常见错误


C++库函数

C++标准库比C标准库要复杂很多,需要大家认真学习。C++标准库建立时间较晚,解决了C标准库的一些问题。通过认真学习、熟练掌握会对代码质量的提高有一定帮助。

一些建议:
1. 尽量使用迭代器代替下标操作
2. 尽量避免使用指针和数组 ,尽可能使用vector和迭代器
3. 采用 string 类型取代 C 风格字符串(使用标准库类型 string,除了增强安全性外,效率也提高了,因此应该尽量避免使用 C 风格字符串)
4. 用指针操作数组时应首先选用类似于迭代器的那种用法
5. const使用时,如果等价,尽量将const放在类型后,以避免类似于typedef使用中的错误
6. 一般而言,应该优先使用标准库抽象类而少用语言内置的低级数组和指针。尤其是应该使用 string 类型取代 C 风格以空字符结束的字符数组。现代 C++ 程序不应使用 C 风格字符串。


下面是一些在我们程序中发现的错误:

1. 不会用 iterator(其实就是没用过STL);
for (iter=v.begin; iter!=v.end(); iter++) {
...
}
if (iter == v.end()) {
}
(漏掉iter == v.end()的判断,直接使用*iter。导致死机。安徽与宁夏出现过,非标准写法的EPG引发。)

2. 多继承时使用reinterpret_cast<>转换。 (Hippo中出现过。死机。)

3. override函数时参数不一致导致被认作两个不同的函数。(Hippo中出现过导致mp对象建立失败,视频无法播放。)

 


不严谨的习惯,写程序不留心环境、上下文

1. getString只传buffer指针,不传buffer大小。
示例:int sysNtvuserGet(char *buf);
点评:在我们程序员的心中总隐藏着一些约定、为程序限定工作场景。要知道需求会变的,记忆会被淡忘的,隐藏在内心的约定是不方便和其他同事交流的。所以要牢记——不要给程序做隐式的限制,所有的限定必须直观,必须落到代码上、文字上。
修正:int sysNtvuserGet(char *buf, int bufLength);

2. 写程序随意性大,不与代码上下关联思考
示例1:if (!strncmp("PVR.Schedule.get", buff, 15)) {
do something ;
} else if () {
。。。。。。
A large number of code
。。。。。。
} else if (!strncmp("PVR.Schedule.getByID", buff, 19)) {
never do here.
}
点评:不整理,不归类,代码可读性差,问题越藏越深,不易发现

示例2:char LogUploadInterval_buf[URL_LEN] = {0};
memset(LogUploadInterval_buf, 0, URL_LEN);
sprintf(LogUploadInterval_buf,"%d",XXX);
点评:一个buffer竟然被清了三次0,不知是认真过头了,还是粗心过头了。

最后请注意:上面多次提到“显式”,“直观”,切记。

 

转载于:https://www.cnblogs.com/sun-frederick/p/4772511.html

相关文章:

  • linux -硬盘分区
  • [8-27]正则表达式、扩展表达式以及相关实战
  • django 名词解释
  • CSS 样式显示为小手
  • javascript exec match 区别
  • python的sorted函数
  • 老程序员总结的15+条经验教训
  • 使用PullToRefresh实现下拉刷新和上拉加载
  • 本地apt
  • [路径规划] VFF和VFH
  • 三招破局 轻松搞定大型直播晚会
  • 一次性代码(单例)
  • 前端面试之闭包
  • linux磁盘管理以及linux文件系统管理
  • 普通用户自动挂载光盘
  • JavaScript 如何正确处理 Unicode 编码问题!
  • Angular 响应式表单 基础例子
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Javascript设计模式学习之Observer(观察者)模式
  • Java面向对象及其三大特征
  • oschina
  • QQ浏览器x5内核的兼容性问题
  • React Native移动开发实战-3-实现页面间的数据传递
  • React中的“虫洞”——Context
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vuex 笔记整理
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  •  一套莫尔斯电报听写、翻译系统
  • 鱼骨图 - 如何绘制?
  • 栈实现走出迷宫(C++)
  • 追踪解析 FutureTask 源码
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #162 (Div. 2)
  • #NOIP 2014#Day.2 T3 解方程
  • (2)STL算法之元素计数
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Forward) Music Player: From UI Proposal to Code
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET MVC 验证码
  • .NET 发展历程
  • .NET 分布式技术比较
  • .考试倒计时43天!来提分啦!
  • @RequestMapping处理请求异常
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [Angular] 笔记 7:模块
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn