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博客)

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

  1. Windows客户端C/C++编程规范“建议”——前言

    前言 工作中接触了很多编程规范.其中最有意思的是,公司最近发布了一版C/C++编程规范,然后我看到该规范的最后一段时,有这么一句:"该规范不适用于Windows平台开发".看来这份 ...

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

    9 风格 9.1 优先使用匈牙利命名法 等级: [推荐] 说明:该方法由微软总设计师设计.Windows上编程最好遵从该标准.详细介绍见:http://zh.wikipedia.org/wiki/%E ...

  3. Windows客户端C/C++编程规范“建议”——宏

    6 宏 6.1 减少宏的使用 等级: [建议] 说明:宏的使用,将使得调试变得麻烦.所以在设计和使用宏的时候,请确保宏的逻辑是阅读者不会去关心细节的行为. 6.2 宏定义中字母需大写 等级: [必须] ...

  4. Windows客户端C/C++编程规范“建议”——函数

    1 函数 1.1 代码行数控制在80行及以内 等级:[要求] 说明:每个函数的代码行数控制应该控制在80行以内.如果超过这个限制函数内部逻辑一般可以拆分.如果试图超过这个标准,请列出理由.但理由不包含 ...

  5. Windows客户端C/C++编程规范“建议”——文件

    7 文件 7.1 正确使用#include 等级:[推荐] 说明:#include <>和#include ""导致编译器在搜索文件时,搜索的路径顺序不同.所以需要正确 ...

  6. Windows客户端C/C++编程规范“建议”——结构

    5 结构 5.1 不要使用goto 等级: [必须] 说明:在大型项目中,goto的滥用会导致灾难性后果.因为我们程序中一般不存在从一个函数体内部跳转到另一个函数体内部的场景,所以我们可以将跳转控制在 ...

  7. Windows客户端C/C++编程规范“建议”——表达式和运算

    4 表达式和运算 4.1 比较操作中将常量设置为左值 等级: [推荐] 说明:编写代码时,如果将常量设置为右值.可能因马虎将"=="写成"="导致逻辑错误.这种 ...

  8. Windows客户端C/C++编程规范“建议”——函数调用

    3 函数调用 3.1 谨慎使用递归方法 等级: [推荐] 说明:递归方式控制不当,可能会导致栈空间不够而崩溃.一般的递归都可以使用循环代替. 3.2 不要使用using namespace 等级: [ ...

  9. Windows客户端C/C++编程规范“建议”——指针

    2 指针 2.1 尽量使用智能指针 等级: [推荐] 说明:正确使用智能指针可以省去指针管理的工作. 2.2 类成员变量指针释放后一定要置空 等级: [必须] 说明:如果类成员变量指针在释放后没有置空 ...

最新文章

  1. C# delegate event
  2. 九种破解Xp登录密码方法
  3. 程序员的恶性循环 !
  4. microstation添加txt文件_C开发实战-文件操作
  5. 类进阶学习目标 java 1614957028
  6. python构建字典查大写英文字母ascii编码_python – 字典中ISO短代码的国家名称,如何处理非ascii字符...
  7. mysql默认密码是多少_192.168.3.1默认登录密码是多少【详细介绍】
  8. 图片不存在显示默认图片
  9. 使用yum方式安装mysql5.6
  10. python 数据挖掘 简书_Python数据挖掘与分析----Pandas常用知识
  11. wps软件打不开共享超链接_wps excel的超链接打不开怎么办?
  12. 如何才能做好短线交易?这三点你要知道!
  13. 《全球互联网金融商业模式:格局与发展》——第2章,第4节众筹型券商
  14. Premiere Pro之时间轴面板(二)
  15. 嵌入式linux pcie网卡配置,[嵌入式linux]PCIe 热拔插(rescan)
  16. C# “贝格尔”编排法
  17. Genin.一日一进步
  18. GPON PLOAM消息
  19. abb机器人指令手册_ABB机器人的程序结构与模块属性
  20. ARM立即数合法性快速判断--求8位常数和4位移数位

热门文章

  1. shell脚本的命令行传参
  2. Java面试之Java基础上册(含答案)
  3. Python实现一元及多元线性回归
  4. 二、如何保存MNIST数据集中train和test的图片?
  5. ktor框架用到了netty吗_教你如何构建异步服务器和客户端的 Kotlin 框架 Ktor
  6. python中星号怎么打出来_Python打印“菱形”星号代码方法
  7. Copy复制命令兼容各种浏览器(等同于触发Ctrl+C或者Command⌘+C)
  8. 使用libevent多线程验证Linux上的服务器惊群现象
  9. UE5和Blender中的完整场景环境创建学习教程
  10. 链路层寻址与 ARP