[笔记]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

总结

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


相关文章
|
9天前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
8天前
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
|
4天前
|
Python Windows
在 Windows 平台下打包 Python 多进程代码为 exe 文件的问题及解决方案
在使用 Python 进行多进程编程时,在 Windows 平台下可能会出现将代码打包为 exe 文件后无法正常运行的问题。这个问题主要是由于在 Windows 下创建新的进程需要复制父进程的内存空间,而 Python 多进程机制需要先完成父进程的初始化阶段后才能启动子进程,所以在这个过程中可能会出现错误。此外,由于没有显式导入 Python 解释器,也会导致 Python 解释器无法正常工作。为了解决这个问题,我们可以使用函数。
13 5
|
6天前
|
编解码 Windows
FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid
XviD是开源MPEG-4视频编码器,与DivX相似但后者非开源。早期MP4常使用XviD或DivX编码,现已被H.264取代。在Windows上集成FFmpeg的XviD编解码库libxvid,需访问<https://labs.xvid.com/source/>下载源码,解压后在MSYS环境中配置、编译和安装。之后重新配置FFmpeg,启用libxvid并编译安装。详细步骤包括configure命令、make和make install。成功后,通过`ffmpeg -version`检查是否启用libxvid。更多音视频开发技术可参考《FFmpeg开发实战:从零基础到短视频上线》。
35 0
FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid
|
30天前
|
存储 C++ 容器
黑马c++ STL部分 笔记(7) list容器
黑马c++ STL部分 笔记(7) list容器
|
27天前
|
编解码 5G Linux
FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器
AVS3是中国首个8K及5G视频编码标准,相比AVS2和HEVC性能提升约30%。解码器libuavs3d支持8K/60P视频实时解码,兼容多种平台。《FFmpeg开发实战》书中介绍了在Windows环境下如何集成libuavs3d到FFmpeg。集成步骤包括下载源码、使用Visual Studio 2022编译、调整配置、安装库文件和头文件,以及重新配置和编译FFmpeg以启用libuavs3d。
41 0
FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器
|
29天前
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
|
29天前
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(4) 常用拷贝和替换算法
黑马c++ STL常用算法 笔记(4) 常用拷贝和替换算法
|
29天前
|
存储 算法 搜索推荐
黑马c++ STL常用算法 笔记(3) 排序算法
黑马c++ STL常用算法 笔记(3) 排序算法
|
29天前
|
算法 C++
黑马c++ STL常用算法 笔记(2) 查找算法
黑马c++ STL常用算法 笔记(2) 查找算法