前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows客户端C/C++编程规范“建议”——变量和常量

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

作者头像
方亮
发布2019-01-16 14:30:48
7660
发布2019-01-16 14:30:48
举报
文章被收录于专栏:方亮

8 变量和常量

8.1 尽量不要使用全局变量

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

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

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

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

等级:【必须】

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

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

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

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

代码语言:javascript
复制
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后。

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

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

代码语言:javascript
复制
char szPath[MAX_PATH] = {0};

        而以下这种写法就没有上面这种写法方便和效率高:

代码语言:javascript
复制
char szPath[MAX_PATH];  
memset( szPath, 0, sizeof(szPath) );

8.4 一行只定义一个变量

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

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

等级:【必须】 说明:在代码逻辑中直接使用常量,将导致代码逻辑非常难读懂。因为常量不具有表意性。         例子:

代码语言:javascript
复制
RECT mainrc;
mainrc.left += 124;
mainrc.top += 56;

        该例子,试图计算出一个窗口中某个控件的位置(无窗口控件)。但是对于第一次读这样的代码的同学,谁知道那两个常量是什么意思?可以这么修改:

代码语言:javascript
复制
RECT mainrc;
const unsigned int unCloseBtnOffX = 124;
const unsigned int unCloseBtnOffY = 56;
mainrc.left += unCloseBtnOffX;
mainrc.top += unCloseBtnOffY;

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

等级:【要求】

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014年09月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 8 变量和常量
    • 8.1 尽量不要使用全局变量
      • 8.2 不涉及外部使用的全局变量需要使用static关键字修饰
        • 8.3 变量需初始化后才能使用
          • 8.4 一行只定义一个变量
            • 8.5 不要直接使用常量参与运算
              • 8.6 变量定义在接近第一次使用处(C除外)
              相关产品与服务
              灰盒安全测试
              腾讯知识图谱(Tencent Knowledge Graph,TKG)是一个集成图数据库、图计算引擎和图可视化分析的一站式平台。支持抽取和融合异构数据,支持千亿级节点关系的存储和计算,支持规则匹配、机器学习、图嵌入等图数据挖掘算法,拥有丰富的图数据渲染和展现的可视化方案。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档