[笔记]c++Windows平台代码规范(下)

简介: [笔记]c++Windows平台代码规范(下)

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. 英文缩写规则

英语缩写规则

  1. 采用去元音(a,e,i,o,u),比如 service=srvc, test=tst

总结

好的编程风格有利于快速理解代码,好的编码习惯也是编码的基本。


相关文章
|
2月前
|
XML C# 数据格式
掌握了在Windows平台上查看DLL依赖的方法
掌握了在Windows平台上查看DLL依赖的方法
266 4
|
3月前
|
监控 Windows
Windows平台RTSP|RTMP播放器如何实时调节音量
我们在做Windows平台RTSP、RTMP播放器的时候,有这样的技术需求,特别是多路监控的时候,并不是每一路audio都需要播放出来的,所以,这时候,需要有针对音量调节的设计
|
2月前
|
监控 Ubuntu Linux
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
这篇文章介绍了如何在Ubuntu和Windows系统中通过设置相同的时区并使用ntp服务来解决时间同步问题。
74 4
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
|
2月前
|
NoSQL Shell MongoDB
Windows 平台安装 MongoDB
10月更文挑战第10天
56 0
Windows 平台安装 MongoDB
|
3月前
|
监控 C# 块存储
Windows平台RTSP|RTMP播放器如何叠加OSD文字
做Windows平台RTSP|RTMP播放器的时候,特别是多路播放场景下,开发者希望可以给每一路RTSP或RTMP流添加个额外的OSD台标,以区分不同的设备信息(比如添加摄像头所在位置),本文主要探讨,如何动态添加OSD台标。
Windows平台RTSP|RTMP播放器如何叠加OSD文字
|
3月前
|
Linux Android开发 iOS开发
Windows平台RTSP|RTMP播放器如何实现实时录像功能
Windows平台RTSP、RTMP播放器实时录像接口设计,实际上,除了Windows平台,我们Linux、Android、iOS平台也是一样的设计,单纯的录像模块,如果做的全面,也不是一两个接口可以搞定的
|
2月前
|
并行计算 开发工具 异构计算
在Windows平台使用源码编译和安装PyTorch3D指定版本
【10月更文挑战第6天】在 Windows 平台上,编译和安装指定版本的 PyTorch3D 需要先安装 Python、Visual Studio Build Tools 和 CUDA(如有需要),然后通过 Git 获取源码。建议创建虚拟环境以隔离依赖,并使用 `pip` 安装所需库。最后,在源码目录下运行 `python setup.py install` 进行编译和安装。完成后即可在 Python 中导入 PyTorch3D 使用。
248 0
|
3月前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
3月前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
4月前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
27 1