编程规范基础学习笔记
基本原则:
1.直观
2.简捷
3.不要省
*****************************************************************************************
---命名规则---
常量名:大写,HAVE_ARCH_STRNCAT
变量名:
1.英文单词组合,可望文生义,避免无意义的数字编号取名。size,len,val,flag
2.简捷,不要过长。
3.名词性词组:DataGotFromSD, CurrentVal ? current_val ? currentVal?
4.局部变量:n,m
i,j,k一般用于int型变量(循环)
c,ch一般用于字符型变量
str表示字符串
a表示数组
p表示指针
5.定义变量时(尤其是指针),必须要先初始化。
6.不要使用八进制常数。
7.不要省结构体名: typedef struct innode
{
int num;
}INNODE;
函数名
1.动词性词组:GetDataFromSD()
2.注意区分字母和数字l,1,o,0
3.函数名不要用在其他地方。
*****************************************************************************************
---流程控制语句编写规范---
if:
1.与零值比较:
1.bool变量: if(bTestFlag); if(!bTestFlag);
2.int变量 :if( a ==0) ;if(a!=0)
3.float变量 :const float EXP = 0.000001(float类型能保留6位小数)
if ( a < EXP && a >-EXP)
3.指针变量:if(NULL==p); if(NULL!=p)
2.条件表达式中,有产生布尔类型数据的表达式中不能有赋值。
错误:if((x=y)!=0) if(x=y)
3.括号应该对齐写,代码应该缩进4个字符(不用TAB)
if(condition)
{
//code
}
else
{
//code
}
3.先处理正常情况,再处理异常情况。
4.if -elseif- 最后应该加else结束。
switch case
1.少分支用if-else,多分支用switch-case
2.switch中表达式中不要有浮点数,不应是产生布尔类型值。
3.case后加整型或字符型常量。每个case实现一个功能,后面必须加break,不要加return;
4.case可按数字或字母顺序排列,正常情况或执行频率高的放前面。
5.case语句要精练<20行,可写成子函数。
6.最后必须加default分支默认处理,default不要用来正常处理。
for循环
1.直观:控制变量采用半闭半开更直观,不要在循环体内修改循环变量。
for(i=0;i<10;i++)
2.精简:循环内不要过长<20行,循环嵌套不要超过3层。
3.长循环放内层。
for(i=0;i<3;i++)
{
for(j=0;j<10;j++)
{
//
}
}
goto
为了便于理解:禁用goto
*****************************************************************************************
---函数编写规范---
1.自己的代码得边写边注释,每个函数必须有注释。
加头:/***********************
*FunName :
*CreateDate :
*Author/Corporation :
*Description :
*Param :
*ReturnCode :
************************/
2.修改别人的代码的时候不要轻易删除,得注释掉后另写。
/* liaoyi 2013-9-21 start */
/* liaoyi 2013-9-21 end */
3.函数定义结束后,需要加空行。
4.函数体内,变量定义和函数语句之间需要加空行。
5.逻辑上不同作用的代码放一起,不同作用的用空行。
6.函数参数名字,返回类型不要省,没有用void
void fun(void)
6.合理缩进,使用4个字符缩进量,不要使用TAB,不同编译器防止混乱。
if(0==b)
{
a=10;
}
else
{
a=20;
}
7.长表达式得分行写,操作符放前头。
8,运算表达式不要太复杂,多用#define,优先级括号不要省。
函数设计规范:
1.返回类型void时,不能用return,用return时不要用多个,用临时变量保存返回值,在函数结尾统一 返回。
返回类型不能与函数名在语义上冲突 如int getchar(void);
2.形参名也应该有意义,如:_ip,_len,strDest,strSrc等。
3.输入的参数在调用函数之前,或者调用之后(入口检验用assert宏),必须错误检查,是否为0等。
4.参数是指针,如果仅用作输入,用const防止意外修改。
int fun(const int *p)
5.局部变量避免重用函数名,不能返回地址,
6.少用static静态局部变量。
7.尽量少用全局变量。
8.指针运算只能在指向同一数组上。不同数组结果未知。
8.少用:errno,<signal.h>, <stdio.h>, <stdlib.h>,<time.h>尤其是嵌入式产品中。
*****************************************************************************************
---注释规范---
1.注释:/* */ ,//
/**/ :1.会被编译器用空格代替
int/*...*/i; ->对,解析为空格
in/*...*/t i; ->错。
2./*总是和离它最近的*/配对,所以不能嵌套。
3.y=x/*p,这里编译器解析/*为注释的开始。
//: 双引号中都被解析为字符串常量
char *s="abcdef //hijk ";
2.注释规范:
1.编写代码边注释
2.注释简单直观,代码右边或上面,不要在代码中间或代码下面注释。
3.全局数据必须加注释。
3.注释尽量用英文。
4.复杂的分支,循环要加注释:end “if(...)”。
3.反斜杠:‘\’
1.断行连接符,编译器自动将下一行字符连接到上一行。注意:反斜杠后和下一行前不能有空格。
2.转义字符, /n,/t,/a
//,/',
/ddd,/xhh,八进制和十六进制ASCII码,可表示任意一个C字符集中符号。
*****************************************************************************************
---内存管理---
野指针:定义了一个指针,没有给它初始化,里面是一个随机地址,容易出现内存错误。
常见内存错误:
1.内存泄露:内存分配后没有释放
malloc: char *p=(char *)malloc(100*sizeof(char));
1.分配后必须强制转换为需要的类型
2.非配的大小用sizeof提高可移植性
3.malloc的内存是堆中剩余的连续内存,不足时申请会失败,返回NULL。所以必须用if(NULL!=p)验证
4.malloc(0)也会返回一个地址,但是无法使用大小为0的内存。这时if(NULL!=p)不起作用。
free:断开指针变量与这块内存的关系,操作系统可销毁。
1.指针中的地址并没有改变,堆的内存中的值也没有改变,只是不能用了而已。
2.molloc一次必须free一次。free少了内存泄露,free多了会出错。
3.free后一定要加 p=NULL,把野指针拴住。
2.内存崩溃:
1.野指针访问了不能访问的内存:定义后必须初始化。int *p=NULL;
2.数组等访问越界
3.使用了已经释放的内存
2.内存碎片:不断的malloc和free,导致内存碎片多,无法申请大的内存。
所以,少用malloc和free!
*****************************************************************************************
---文件结构---
头文件,源文件均可包含:
/************************************************************************
*File Name :FN_FileName.h
*Copyright :2003-2008 XXXX Corporation,All Rights Reserved.
*Module Name :DrawEngine/Display
*CPU :ARM7
*RTOS :Tron
*Create Date :2008/10/01
*Author/Corporation :WhoAmI/yourcompany name
*AbstractDescription :Place some descriptionhere.
*--------------------------RevisionHistory-------------------------
*No Version Date Revised By Item Description
*1 V0.95 08.05.18 WhoAmI abcdefghijklm WhatUDo
*
************************************************************************/
头文件:
#ifndef __FN_FILENAME_H
#define __FN_FILENAME_H
#define D_DISP_BASE
#include "IncFile.h"
#define MAX_TIMER_OUT (4)
typedef structCM_RadiationDose
{
unsigned charucCtgID;
charcPatId_a[MAX_PATI_LEN];
}CM_RadiationDose_st,*CM_RadiationDose_pst;
unsigned intMD_guiGetScanTimes(void);
…
…
#endif
源代码:
#define D_DISP_BASE
#include "IncFile.h"
typedef struct CM_RadiationDose
{
unsigned char ucCtgID;
char cPatId_a[MAX_PATI_LEN];
}CM_RadiationDose_st, *pCM_RadiationDose_st;
unsigned int MD_guiGetScanTimes(void);
extern unsigned int MD_guiHoldBreathStatus;
static unsigned int nuiNaviSysStatus;
Function Define Section
可移植性:
转载于:https://www.cnblogs.com/liaoyi425/p/3766525.html
编程规范基础学习笔记相关推荐
- Uber 《Go语言编程规范》学习笔记(一)
Interface 合理性验证 在编译时验证接口的符合性.这包括: 将实现特定接口的导出类型作为接口API 的一部分进行检查 实现同一接口的(导出和非导出)类型属于实现类型的集合 任何违反接口合理性检 ...
- 日语课程0基础学习笔记——第一课
学习目标: 编程0基础学习笔记--前言 这是一个个人使用的日语学习记录博客!根据B站的up日语教程一直跟下来,从第一天开始记录.后续会把我学习的内容和知识点尽量多的记录在这个博客中,不仅是方便自己复习 ...
- 《Java并发编程实践》学习笔记之一:基础知识
<Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念: (2)进程:是一种活动,它是由一个动作序列组成 ...
- 【C#编程基础学习笔记】6---变量的命名
2013/7/24 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]6---变量的命名 ----- ...
- 【C#编程基础学习笔记】4---Convert类型转换
2013/7/24 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]4---Convert类型转换 ...
- 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程
8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...
- Python基础学习笔记之(一)
Python基础学习笔记之(一) zouxy09@qq.com http://blog.csdn.net/zouxy09 前段时间参加微软的windows Azure云计算的一个小培训,其中Pytho ...
- 8. SpringBoot基础学习笔记
SpringBoot基础学习笔记 课程前置知识说明 1 SpringBoot基础篇 1.1 快速上手SpringBoot SpringBoot入门程序制作 1.2 SpringBoot简介 1.2.1 ...
- guido正式发布python年份_Python 基础学习笔记.docx
Python 基础学习笔记 基于<Python语言程序设计基础(第2版)> 第一部分 初识Python语言 第1章 程序设计基本方法 1.1 计算机的概念 计算机是根据指令操作数据的设备, ...
- Python3 基础学习笔记 C01【变量和简单数据类型】
CSDN 课程推荐:<8小时Python零基础轻松入门>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python:轻松入门& ...
最新文章
- 在python中定义类时、运算符重载_自定义 Python 类中的运算符和函数重载(上)...
- 二分图最小覆盖的Konig定理及其证明
- ubuntu(linux)下安装openCV(ffmpeg导致的编译不通过的解决办法)
- 测试点2详解:1045 快速排序 (25分)——23行代码满分
- java知识回顾_Java – 2012年回顾和未来预测
- 20145210 20145226实验一
- Maven命令安装JAR包到本地仓库
- 幼儿园观察记录的目的和目标_幼儿园游戏观察记录
- 计算机有哪些交叉专业研究生,与理工科交叉的计算机专业考研方向有哪些?
- 共享换电:车企筑垒,宁王拆墙
- 【元器件学习笔记—电阻】(7)——电阻串并联电路
- python eel 多线程_Python的一个轻量级桌面GUI开发第三方库:Eel
- SpringBoot基础知识
- 思途cms php文件说明,思途旅游CMS系统二次开发说明文档(v5.0).pdf
- linux无法安装at命令,在Ubuntu/Debian/CentOS/Fedora下安装At及各种At命令的用法
- 计算机开机最快设置,怎样让电脑开机更快
- 最短路(弗洛伊德——最短路)
- python框架Django数据库类型
- Python字典嵌套
- VCS命令详解(二):仿真命令
热门文章
- OpenCV环境搭建(Windows+Visual studio)及Hello World
- 2015年9月01日【磁盘和文件系统管理】-JY1506402-19+liuhui880818
- 《专家系统破解篇 六、IL代码破解--配套乱说》之 FeatherskyExpertSystem
- eclipse 设置和快捷键
- 使用tcpdump抓Android网络包
- springcloud ip部署_php接入SpringCloud微服务框架
- java大于0的正则_求一个 大于0且小于1 的正则表达式(无论几位小数)
- 月结 sap_SAP的SD模块:从DN到Billing再到Invoice
- java栈链_Java实现链栈
- php api接口怎么写,php如何写api接口?