当前位置: 首页 > 编程日记 > 正文

Windows客户端C/C++编程规范“建议”——变量和常量

8 变量和常量

8.1 尽量不要使用全局变量

等级: 【要求】
说明:全局变量的滥用和goto的滥用一样,都是一种灾难。它将使得逻辑变得难以调试和控制。

8.2 不涉及外部使用的全局变量需要使用static关键字修饰

等级: 【要求】
说明:这样可以避免冲突。

8.3 变量需初始化后才能使用

等级: 【必须】

说明:变量最好在定义时初始化。如果定义时无法初始化,那就应该在定义后立即初始化。

以下我们来分析下变量未初始化而被使用的场景:

在debug环境下,我们声明一个变量,编译器会使用0xCC填充变量所在空间。而在Release环境下,变量所在空间是不会被初始化的。所以我们经常会发现一些奇怪的现象:在debug环境下逻辑是正确的,release环境下逻辑是错误的。
        变量没有初始化存在如下危害:

  1. 产生脏数据。由于变量空间没有初始化,会导致脏数据的产生。可以见下例。
  2. 影响正常逻辑。脏数据将会导致之后使用相关数据的地方出现逻辑错误。
  3. 间接导致崩溃。可以见下例:快哭了

void MyPrintf( char* p ) {strcat(p, "abcdefghijklmnopqrstuvwxyz"); printf("%s", p);
}int _tmain(int argc, _TCHAR* argv[])
{char szBuffer[32];  std::string str = "01234";memcpy_s( szBuffer, _countof(szBuffer), str.c_str(), str.length() );  MyPrintf(szBuffer);return 0;
}

该例中,栈上分配了一段32字节的空间。由于该空间没有初始化,所以在一定概率下,这段内存中不会出现0x00。于是之后的strcat将会导致堆栈溢出。我这儿将strcat放到一个函数内部,是为了比较方便的触发崩溃。


执行strcat后。



基于以上危害,我们在申明变量时需要初始化。类的成员变量,需要在构造函数中初始化。

这儿有个需要特别说明的,静态数组初始化请使用:微笑

char szPath[MAX_PATH] = {0};
而以下这种写法就没有上面这种写法方便和效率高:
char szPath[MAX_PATH];  
memset( szPath, 0, sizeof(szPath) );

8.4 一行只定义一个变量

等级: 【要求】
说明:一行只定义一个变量,将会使的变量的初始化、维护变得方便。

8.5 不要直接使用常量参与运算

等级: 【必须】
说明:在代码逻辑中直接使用常量,将导致代码逻辑非常难读懂。因为常量不具有表意性。
例子: 快哭了
RECT mainrc;
mainrc.left += 124;
mainrc.top += 56;
该例子,试图计算出一个窗口中某个控件的位置(无窗口控件)。但是对于第一次读这样的代码的同学,谁知道那两个常量是什么意思?可以这么修改: 微笑
RECT mainrc;
const unsigned int unCloseBtnOffX = 124;
const unsigned int unCloseBtnOffY = 56;
mainrc.left += unCloseBtnOffX;
mainrc.top += unCloseBtnOffY;

8.6 变量定义在接近第一次使用处(C除外)

等级: 【要求】

说明:这样设计将使得代码可读性加强。


(转载请指明出于breaksoftware的csdn博客)

相关文章:

机器学习模型五花八门不知道怎么选?这份指南告诉你

作者 | LAVANYA译者 | 陆离编辑 | 夕颜出品 | AI科技大本营(ID: rgznai100)【导读】在本文中,我们将探讨不同的机器学习模型,以及每个模型合理的使用场景。一般来说,基于树形结构的模型在Kaggle竞赛中是表现最好的&…

WinAPI: FlattenPath、WidenPath

不管什么曲线命令, 到来路径中都会变成 Bezier 线; 也就是说路径中只有直线和 Bezier 线.FlattenPath 和 WidenPath 都能够把路径中的 Bezier 线转换为近似的直线; 不同的是: 用 WidenPath 转换后貌似加宽了线, 其实它是转换成了一个包围路径的新路径(类似区域).本例效果图:代码…

Android - 小的特点 - 使用最新版本ShareSDK手册分享(分享自己定义的接口)

前太实用Share SDK很快分享,但官员demo快捷共享接口已被设置死,该公司的产品还设计了自己的份额接口,这需要我手动共享。 读了一堆公文,最终写出来,行,废话,进入主题。 之前没实用过ShareSDK分享…

结合Flink,国内自研,大规模实时动态认知图谱平台——AbutionGraph |博文精选

作者 | Raini出品 | 北京图特摩斯科技 (www.thutmose.cn)(*点击阅读原文,查看作者更多精彩文章)Flink:目前最受关注的大数据技术,最活跃 Apache 项目之一。AbutionGraph:北京图特摩斯科技自研的…

Windows客户端C/C++编程规范“建议”——风格

9 风格 9.1 优先使用匈牙利命名法 等级: 【推荐】说明:该方法由微软总设计师设计。Windows上编程最好遵从该标准。详细介绍见:http://zh.wikipedia.org/wiki/%E5%8C%88%E7%89%99%E5%88%A9%E5%91%BD%E5%90%8D%E6%B3%959.2 变量名结合使用匈牙…

使用GIF(仅限Delphi2007)

-----------uses GIFImg; procedure TForm1.FormCreate(Sender: TObject); begin // 先在窗体上放一个 TImage 组件:Image1; Image1.Picture.LoadFromFile(C:\Example.gif); // AnimationSpeed 设定动画速度,值越大,速度越快…

使用Depth Texture

使用Depth Textures:   可以将depth信息渲染到一张texture,有些效果的制作会需要scene depth信息,此时depth texture就可以派上用场了。   Depth Texture在不同平台上有不同的实现,并且原生的支持也不一样。   UnityCG.cgin…

Exchage 2007 Client Application Functions(2) -- 如何收取邮件

上一篇介绍的Exchange2007客户端程序中怎么发送邮件。现在,我来简单介绍一下怎么收取邮件。来看代码:publicHashtable GetAllMails(DateTime StartDate, DateTime EndDate) { try { if (null this.m_esb) …

VC开发Windows客户端软件之旅——前言

从第一次拖着行李入京找活,至今已工作若干年了。这些年一直追逐自己的梦想,跑过三个城市,换了三份工作,认识了很多业内的朋友。和朋友们闲聊时,发现很多人都已经不再做客户端软件了。有的转去做管理,有的转…

代替Mask R-CNN,BlendMask欲做实例预测任务的新基准?

「免费学习 60 节公开课:投票页面,点击讲师头像」作者 | Hao Chen、Kunyang Sun、Zhi Tian、Chunhua Shen、Yongming Huang、Youliang Yan译者 | 刘畅编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导读】实例分割是…

如何让ie 7 支持box-shadow

box-shadow是一个很好用并且也常用的css 3属性&#xff0c;但是&#xff0c;如果我们要保证它能在ie 8及更低的版本下运行的话&#xff0c;需要借助一些其他的插件或文件。在这里我主要讲一下&#xff0c;如何用PIE.htc来解决ie 7不支持box-shadow。 代码如下&#xff1a; <…

拥有AI「变声术」,秒杀了多年苦练的模仿艺能

「免费学习 60 节公开课&#xff1a;投票页面&#xff0c;点击讲师头像」作者 | Daniel Chen&#xff0c;爱奇艺资深研发工程师 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】什么是Voice Conversion&#xff08;VC&#xff09;&#xff1f;它有…

服务器架设笔记——编译Apache及其插件

之前一直从事Windows上的客户端软件开发&#xff0c;经常会处理和服务器交互相关的业务。由于希望成为一个全栈式的工程师&#xff0c;我对Linux上服务器相关的开发也越来越感兴趣。趁着年底自由的时间比较多&#xff0c;我可以对这块做些技术研究。虽然这些知识很基础也很老&a…

Silverlight 2中多语言支持实现(上)

引言 最近项目要在Silverlight 2应用程序中实现本地化&#xff0c;原以为这个过程非常简单&#xff0c;却没想到实现的时候一波三折&#xff0c;好在结果还算不错。需求是这样的&#xff0c;用户第一次访问的时候&#xff0c;默认为英文&#xff0c;当用户选择一种显示语言后&a…

解析大型.NET ERP系统 多国语言实现

实现多国语言有许多种实现方案&#xff0c;无外乎是一种字符串替换技术&#xff0c;将界面控件的文本标签替换成相应语言的文字。.NET Windows Forms实现多国语言的方法有以下几种&#xff1a; 1 .NET的方案&#xff0c;使用资源文件 分别做三个语言的资源文件&#xff0c;比如…

服务器架设笔记——Apache模块开发基础知识

通过上节的例子&#xff0c;我们发现Apache插件开发的一个门槛便是学习它自成体系的一套API。虽然Apache的官网上有对这些API的详细介绍&#xff0c;但是空拿着一些零散的说明书&#xff0c;是很难快速建立起一套可以运行的系统。&#xff08;转载请指明出于breaksoftware的csd…

解密Elasticsearch技术,腾讯开源的万亿级分布式搜索分析引擎

「免费学习 60 节公开课&#xff1a;投票页面&#xff0c;点击讲师头像」作者 | johngqjiang&#xff0c;腾讯 TEG 云架构平台部研发工程师来源 | 腾讯技术工程&#xff08;ID&#xff1a;Tencent_TEG&#xff09;【导读】Elasticsearch&#xff08;ES&#xff09;作为开源首选…

Centos5上firefox的升级

Centos5上firefox的升级默认Centos5上firefox的版本是1.5当我们使用yum update firefox提示到的版本还是1.5 可是我们在使用1.5版本的firefox可能会有一些问题&#xff0c;比如打不开QQ空间接下来我们就将系统的firefox从rpm包的1.5版本升级到tar包的3.0首先删除1.5版本的fire…

cheat engine lua

function CEButton1Click(sender) local x getProperty(CETrainer.CEEdit1,"Text")--这句很重要,获取文本框的值 --writeInteger(0x42c0c0,readInteger(0x42c0c0)x)--设置0X42C0C0地址的值 setProperty(CETrainer.CEEdit2,"Text","0001000")--设…

服务器架设笔记——使用Apache插件解析简单请求

一般来说&#xff0c;对于一个请求&#xff0c;服务器都会对其进行解析&#xff0c;以确定请求的合法性以及行进的路径。于是本节将讲解如何获取请求的数据。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 我们使用《服务器架设笔记——编译Apache及其插件》…

如何用Python快速抓取Google搜索?

「免费学习 60 节公开课&#xff1a;投票页面&#xff0c;点击讲师头像」作者 | linksc译者 | 弯月&#xff0c;编辑 | 郭芮来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;自从2011年 Google Web Search API 被弃用以来&#xff0c;我一直在寻找其他的方法来抓取G…

利用歌词插件 让WMP活起来

如果利用起这个歌词插件的话 是不是可以减少下载那么多播放器和每次更新的烦恼呢?因为WMP是系统自带的.可以下载的插件名称:Wa3 Music Engine 或者乐辞的歌词秀插件转载于:https://blog.51cto.com/david25/84211

Linux性能研究(总)

http://www.vpsee.com/2009/11/linux-system-performance-monitoring-introduction/ http://www.jb51.net/LINUXjishu/34607.html 公司有个测试服务器&#xff0c;上面跑了几个应用和一个DB。 DB被这个几个应用使用。 最近老是被挂掉。 CPU 使用率100%。 搞到最后大家都不能用。…

万字干货:如何从零开始构建企业级推荐系统?

「免费学习 60 节公开课&#xff1a;投票页面&#xff0c;点击讲师头像」作者丨gongyouliu编辑丨zandy来源 | 大数据与人工智能&#xff08;ID: ai-big-data&#xff09;最近几个月有很多人咨询作者怎么从零开始搭建工业级推荐系统&#xff0c;有做音视频的、有做新闻资讯的、有…

Mocha BSM基础架构管理——灵活的网络拓扑展现

业务需求与挑战企业的网络拓扑结构与设备时常变化&#xff0c;人工往往难以维护网络拓扑。尤其对于上千台设备的大型网络来说情况更为复杂。当用户网络设备大量增加后&#xff0c;网络结构异常复杂&#xff0c;用户的网络拓扑很难在一个屏幕上展现或者很难找到要查阅的网络拓扑…

服务器架设笔记——打通MySQL和Apache

在《服务器架设笔记——使用Apache插件解析简单请求》一文中&#xff0c;我们已经可以获取请求内容。这只是万里长征的第一步。因为一般来说&#xff0c;客户端向服务器发起请求&#xff0c;服务器会有着复杂的业务处理逻辑。举个例子&#xff0c;大部分客户端软件都有日志模块…

【Maven】maven的安装配置和ecplise结合

2. Maven的安装和配置 2.1. 安装 进入Maven官网的下载页面&#xff1a;http://maven.apache.org/download.cgi&#xff0c;如下图所示&#xff1a; 选择当前最新版本&#xff1a;“apache-maven-3.0.4-bin.zip”&#xff0c;下载到本地&#xff0c;解压缩到本地磁盘D:下。 2…

2020年趋势一览:AutoML、联邦学习、云寡头时代的终结

作者 | Roberto Sannazzaro&#xff0c;Ben Longstaff译者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 【导读】在 2020 年来临之际&#xff0c;新年前夕往往是人们回顾过去一年并展望来年的好时机。本文将深入探讨了关于 AI 的技术和非技术方面的趋势&am…

使用C++实现一套简单的状态机模型——实例

一般来说&#xff0c;“状态机”是一种表达状态转换变换逻辑的方法。曾经有人和我讨论过为什么不直接用ifelse&#xff0c;而要使用“状态机”去实现一些逻辑&#xff0c;认为使用“状态机”是一种炫技的表现。然而对于大型复杂逻辑的变化和跳转&#xff0c;使用ifelse将带来代…

net通过oledb 和ibm自带连接方式,连接db2数据库出错

第一种通过ibm方式连接 DataSet ds new DataSet(); OleDbConnection cn new OleDbConnection( "ProviderIBMDA400.1;Data Source192.168.21.10;User IDb4dd;" "Passwordb4dd;Default CollectionQIBMPP"); …