我的C语言编程风格
前几天看别人的代码,真是的看的头昏脑涨,基本没有注释、乱起的变量名字,还要费尽心思去解读作者的意思。突然感觉高效的程序注释说明和良好的编程风格是多么的重要。
为了不让别人在看到我的代码时在背后骂我,也为了更高效持久的开发,我想也应该是时候特别规定一下自己的编程风格了。
1、文件/文件夹命名
文件命名要精确,文件名要准确反映文件内容。
文件命名一律使用小写字母,如keyboard.c。
如有缩写单词,则必须大写,如flash_LED.c、UART.c。其中LED是Light-Emitting Diode(发光二极管)的缩写,UART是Universal Asynchronous Receiver/Transmitter(通用异步收发器,也就是串口)的缩写。对于有约定俗成缩写的单词,就使用缩写词汇。
文件名应使用名词,而不应该使用动词。如果文件内容是数据采集,应该命名为data_collection.c而非data_collect.c。
2、标识符命名
C语言中,可以定义各种标识符作为变量名、数组名、函数名、标号及用户定义对象的名称。ANSI C规定标识符必须由字母和下划线开始,随后可以出现字母、下划线和数字。
1)变量命名
变量命名一律小写,缩写词汇用大写,且全部使用名词,可以使用形容词修饰,用“_”表从属关系。因为变量名作为一个变量的名字,就应该是一个名词。
局部循环体控制变量用i,j,k。如for(i=0;i<100;i++)。
指针变量用“p_”开头,后面接指向内容。如指向高度变量的指针,命名为“*p_height”。请读者自行区分指针和指针变量的区别。
局部变量尽量用一个单词表达清其含义。
全局变量命名时首先写所属模块名称。例如如一个传感器文件sensor.c里面的一个全局变量要代表温度,则命名为sensor_temperature。又例如LCD(液晶显示屏)文件LCD.c中表示LCD状态的全局变量命名为LCD_status。因为全局变量往往跨文件调用,如不写清变量定义位置,当程序庞大,而IDE又不支持一键定位时,查找起来很麻烦。即使IDE支持一键定位,一个清楚明白的命名,能让人瞬间读懂该变量的含义。
2)数组命名
数组命名各单词首字母大写,其他同变量。
读者可能会有疑问,数组名后面会有[]符号,与变量区别明显,为什么要用首字母大写的方式。实际上,在数组名作为实参传递数组首地址时,往往会省略[]符号,应该数组名就是数组的首地址。例如:
unsigned char string[]=”abcdefg”;
printf(“%s”,string);
在以上代码中,string是一个8位数组(为什么是8位?),在使用printf()函数输出时,只写了数组名,显然这种方式是被允许的。而此时就没有写[],在这种情况下,并不能瞬间知道string是变量还是数组,而需要参考前面的格式控制符“%s”。在其他函数中,或许没有“%s”这样的格式控制符帮助我们判断string到底是数组还是变量,我们只有找到函数的声明或定义才能知道答案,严重影响阅读。因此有必要对数组和变量加以区分。
3)函数命名
函数命名各单词首字母大写,写成主谓语形式,主语用名词,谓语用动词,缩写词汇用大写,用“_”表从属关系。主语通常为模块名,而谓语是描述模块的动作。因为函数本身就是用来执行一系列的动作的, 结合函数参数,可以表达通顺的语句。举个简单的例子:延时函数。定义一个ms级延时函数为:
void Delay(unsigned int ms);
当然,函数命名中必要时可以出现宾语。这种情况多出现在函数没有参数的情况下。如一个函数的功能是LCD显示时间,而时间是全局变量,因此这个函数就不需要参数,此时直接定义成void LCD_Display_Time(void)(其实是声明,因为没写函数体)。
4)标号命名
由于在硬件编程中标号可以用循环来代替,所以很少用到。我们规定标号的命名格式基本同变量,使用全部小写的名词,但是只用一个单词表示即可。因为标号时候的时候或者前面加了goto,或者后面加了“:”,很容易与变量区分开。况且只是一个定位标志,所以一个单词足够了。
5)自定义类型命名
自定义类型命名主要指使用typedef定义的新类型名,以及结构体类型、共用体类型的类型名(而非该类型的变量名)。
自定义的新类型名,只用一个单词,首字母大写。但是定义这种新类型的变量时,命名规则与变量命名规则完全相同。
请自行体会新类型名与新类型变量的区别。
6)宏定义命名
宏定义命名全部使用大写字母,单词数不限。可以加入数字和下划线,但是数字不能开头 。
由于宏定义的特殊性,对其使用名词或动词不作规定。因为宏定义一个函数时,应该是动词性质,而宏定义一个常数时,应该是名词性质。
3、表达式的书写
操作数与运算符之间要有空格隔开,以便于区分。
4、文件编写
(1)、文件按模块划分,函数按功能划分。
(2)、
源文件(.c) |
头文件(.h) |
头文件包含指令(#include) |
头文件包含指令(#include) |
宏定义(#define) |
|
所有函数定义(必须有函数体,即{ }) 内部函数声明(static,不能有函数体) |
外部函数声明(extern,不能有函数体) |
外部变量定义(必须赋初值) 静态外部变量定义(static,必须赋初值) |
外部变量声明(extern,不能赋值) |
自定义类型(typedef) |
|
外部数组定义 静态内部数组定义(static) |
外部数组声明(const) |
条件编译 |
条件编译 |
由上表可以看出,h文件内存放的都是对外可见的变量、函数数组等的声明,宏定义则是对内对外都可以使用,放在这里主要为了修改方便。
在定义外部变量、数组和函数时,不需要写extern,因为缺省时默认extern。而声明外部变量、数组和函数时,必须用extern显式声明,这样是为了让代码更直观。
(3)、函数头部注释格式
/********************************************************
*名 称: function(int par)
*功 能:**
*入口参数:**
*出口参数:**
*说 明:
********************************************************/
借鉴了一些良好的编程风格:http://www.cnblogs.com/foxsay/p/5331388.html
我的C语言编程风格的更多相关文章
- 个人c语言编程风格总结
总结一下我个人的编程风格及这样做的原因吧,其实是为了给实验室写一个统一的C语言编程规范才写的.首先声明,我下面提到的编程规范,是自己给自己定的,不是c语言里面规定的. 一件事情,做成和做好中间可能隔了 ...
- c语言编程风格
关于c语言的编程风格,不同的书上有不同的推荐,不同的公司有不同的要求.这里,做了一下基本规范说明. 1.变量定义 在定义变量时,前缀使用变量的类型,之后使用表现变量用途的英文单词或单词缩写,且每个单词 ...
- C语言编程风格(转发)
- C编程风格.
C语言编程风格. 关于编程风格,不同书上有不同规范,不同公司都有自己的一套定义.根据自己的编程习惯做个简要说明. 1.变量定义 在定义变量时,前缀使用变量的类型,之后使用表现变量用途的英文单词或单词缩 ...
- R 语言编码风格指南
R 语言是一门主要用于统计计算和绘图的高级编程语言.这份 R 语言编码风格指南旨在让我们的 R代码更容易阅读.分享和检查.以下规则系与 Google 的 R 用户群体协同设计而成. 概要: R编码风格 ...
- Google Java编程风格指南
出处:http://hawstein.com/posts/google-java-style.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Comm ...
- 编程风格(Coding Style)要求
编程风格(Coding Style)要求2.1.1 文件(1) 每个模块(module)一般应存在于单独的源文件中,通常源文件名与所包含模块名相同.(2) 每个设计文件开头应包含如下注释内容:? 年份 ...
- Javascript编程风格
Douglas Crockford是Javascript权威,Json格式就是他的发明. 去年11月他有一个演讲(Youtube),谈到了好的Javascript编程风格是什么.我非常推荐这个演讲,它 ...
- 来自 Google 的 R 语言编码风格指南
来自 Google 的 R 语言编码风格指南R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读.分享和检查. 以下规则系与 Google ...
随机推荐
- tk.mybatis通用插件updateByPrimaryKeySelective无法自动更新ON UPDATE CURRENT_TIMESTAMP列的解决办法
tk.mybatis是一个很好用的通用插件,把CRUD这些基本的数据操作全都用动态SQL语句自动生成了,mapper和xml里十分清爽,但是昨天发现有一个小坑,记录在此: 有一张表,结构如下(已经简化 ...
- Exchange Online Mailbox Restoration
User Account is already deleted in AD.User Mailbox is already deleted in Exchange. 1. Connect to Exc ...
- android:如何通过chrome远程调试APP中的webView的h5代码
今天出现一个问题,在老板的Mate9 Pro上,我们APP的所有H5页面都是一片空白,但是在其他手机上都是好的,那么我们就怀疑是h5报错了,但是到底是什么错,无法得知,所以就想要可以像在pc的chro ...
- Js实现Table动态添加一行的小例子
<form id="form1" runat="server"> <div> <table id=" style=&qu ...
- [Vuex] Use Namespaces in Vuex Stores using TypeScript
Even by using modules, they still share the same namespace. So you couldn’t have the same mutation n ...
- 下载网络文件HttpURLConnection.getContentLength()大小为 0
HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestProperty("Acce ...
- Python分页组件
分页组件的实现: class Pagination(object): """ 自定义分页 """ def __init__(self,cur ...
- BizTalk日志自动发送邮件通知
更多内容请查看:BizTalk动手实验系列目录 BizTalk 开发系列 BizTalk 培训/项目开发/技术支持请联系:Email:cbcye ...
- AspectF写法
AspectF.Define .ProgressBar(caption) .Do(() => { if (!SpecialMenuClick(midForm, tag)) { DockBarSh ...
- windows nginx配置https访问
本文主要记录在windows下安装nginx 环境:win10-64位. 1. 到nginx官网上下载相应的安装包,http://nginx.org/en/download.html: 下载进行解压 ...