4.代码编写原则
4.1 【内存申请原则】谁创建谁释放,平级作用域内释放
{ int *pNum = new int(); { int *pNum2 = new int(); delete pNum2; } delete pNum; }
4.2 【结构体初始化原则】在创建结构体前/构造函数中初始化值
struct test { int a; int b; test(){ a = 0; b = 0; } } struct test testa; memset(testa,0,sizeof(testa));
声明初始化以及构造初始化 有利于避免野指针。
4.3 【函数实现原则】引用作为形参时,不能改变形参内容
禁止用法:
void func(std::string &name){ name = "!23" }
正确用法:
void func(const std::string &name){ }
4.4 【函数实现原则】函数传入的形参需要校验安全性和可用性!!!
验证参数可用性和安全性非常重要,以及处理对应的错误情况的处理方式 抛异常还是返回false都是决定软件的体验是否流畅
禁止用法:
void func(Point *p){ use(p); // wrong }
正确用法:
void func(Point *p){ if (p == nullptr) { return } use(p); // right }
4.5 【日志打印写法】使用format格式,诸如printf("%s),格式化风格,符号替换会操作比较单一,不会影响性能
4.6 【常用数值,避免硬编码】一些灵活多变的数值,比如定时刷新时间,最大值最小值这些尽量用可灵活设置的方法,比如宏定义,静态变量存储,避免写死在代码里(硬编码)
5.代码格式
5.1 一行只申明一个变量,且声明后马上初始化
错误范例:
int a,b,c;
正确范例:
int a = 0; int b = 0; int c = 0; char *buffer = new char[260]; memset(buffer,0,260);
5.2 代码块之间用 多使用换行 分隔
错误范例:
int a; int b; int c; if(b==2){ ... }
正确范例:
int a; int b; int c; if(b == 2) { ... }
5.3 操作符与变量之间 多使用 空格 分隔
错误范例:
if(b==0){...} a>b?0:1;
正确范例:
if(b == 0){ ... } a > b ? 0 : 1;
5.4 判断语句和循环语句 内容必须用{}包裹
错误范例:
if(a==0) return a; while(1) return 0;
正确范例:
if(a==0) { ... } while(1) { return 0; }
5.5 {}包裹的内容必须有层次感 通过一层一个tab
错误范例:
if(a==0) { while(1) { return 0; } return a; }
正确范例:
if(a == 0) //1 层 { while(1) // 2层 { return 0;//3 层 } return a;//2层 }
5.6 编译器尽量设置 1个tab=4个空格
5.7 操作符和变量之间 必须用空格分割开来
a = b test(a, b)
6.常见通俗规定
6.1 函数形参顺序 先dst,后src (可选)
void *memcpy(void *destin, void *source, unsigned n);
6.2 长循环放内部,短循环放外部
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
例如示例1的效率比示例2的高。
示例1
for(int i = 0; i < 10;i++){ printf("for out"); for(int j = 0; j < 100;j++){ printf("for in"); } }
示例2
for(int i = 0; i < 100;i++){ printf("for out"); for(int j = 0; j < 10;j++){ printf("for in"); } }
6.3 使用const static 代替 #define (可选)
宏定义可减少一定内存开销,转移到代码段。
const static 会产生内存开销。
6.4 执行命令时 文件路径 记得用转义字符 \" \"圈起来路径
6.5 路径中的斜杠 默认使用反斜杠 /
windows \\等于/ linux /就是/
6.6 四个空格等于一个tab 但一般用4个空格 一个tab某平台等于8个空格
7.常见埋坑操作
7.1 文件路径
1.文件路径字符串请用""圈起来,避免有空格情况以及部分系统无法识别相关命令
2.文件路径字符串如果有中文请使用Unicode编码
7.2 注释中包含中文时,请在注释结尾使用英文句号,不然编译可能存在问题。
错误:
//测试
正确:
//测试.
或者
// //测试 //
原因:使用中文一般文件就默认识别为多字节,多字节文件,会识别代码也为多字节,会读取多个字节为一个字符,导致代码编译出错。
8. 常用技巧
8.1 vs设置tab为4个空格
跨平台代码统一使用空格作为格式化代码的符号
8.2 文本换行采用unix LF 而非 windows CRLF
不然可能会有调试代码时 出现错行的问题,即源代码和debug断点位置没匹配上(断点错位,断点无效等)的问题
跨平台代码统一使用LF
调试代码错位时,可以试试更改文件编码为(utf-8带签名)
UTF-8有带签名和无签名
在VS中编码保存时,文件编码的选择里的UTF-8有带签名和无签名2种,那么到底有什么区别呢?
带签名即文件头含BOM信息,不带则没有。
带了的好处是,只要支持多编码的编辑器都能正确识别出文件编码。
不带的话,就不一定了,就有可能识别错别。
总之呢,这个BOM信息也就那么三字节,没必要省这么一点点空间,要用UFT-8就选带签名,这样就不会错了。
9. 英文缩写规则
- 采用去元音(a,e,i,o,u),比如 service=srvc, test=tst
总结
好的编程风格有利于快速理解代码,好的编码习惯也是编码的基本。