C语言编码风格_集锦_1
参考原地址:
http://www.jb51.net/article/79257.htm
<一>
在一个标准的C语言程序中, 最特殊的莫过于main函数了. 函数大体上分为内联函数(C99)和非内联的普通函数, 它们之间有一个明显的特点(一般情况下), 那就是不写原型直接在main函数上定义, 即使不加"inline"关键字,也能被编译器默认为内联函数, 但之后带来的某些并发问题就不是编译器考虑的了.
普通函数正确的形式应该为声明与定义分离. 声明就是一个函数原型, 函数原型应该有一个函数名字, 一个参数列表, 一个返回值类型和一个分号. 定义是函数的内在, 花括号内就是函数的定义:
//...
int function(int arg_1, float arg_2);
//...
int main(int argc, char* argv[])
{
int output = function(, 22.0);
printf("%d\n", output);
return ;
} int function(int arg_1, float arg_2)
{
int return_value = arg_1;
float temp_float = arg_2;
return return_value;
}
依上所述, 当非必要时, 在自己编写函数时,请注意在开头(main函数之前)写上你的函数原型, 并且在末尾(main函数之后)写上你的函数定义. 这是一个很好的习惯及规范. 所谓代码整洁之道, 就是如此.
函数的另一种分类是, 有返回值和无返回值. 返回值的类型可以是内建(build-in)的, 也可以是自己定义的(struct, union之类), 无返回值则是void.
为什么我们十分谴责void main()这种写法? 因为这完全是中国式教育延伸出来的谭氏写法. main函数的返回值看似无用, 实际上是由操作系统接收. 在Windows操作系统也许无甚"大碍"(实际上有), 但当你使用Linux的过程中你会清晰地发现一个C语言程序的main返回值关系到一个系统是否能正常, 高效地运行. 这里稍微提一句: 0在Linux程序管道通信中代表着"无错可行"的意思. 所以请扔掉void main()这种写法.
为什么我们对main()这种省略返回值的写法置有微词? 能发明这种写法的人, 必定是了解了, 在C语言中, 如果一个函数不显式声明自己的返回值, 那么会被缺省认为是int, 但这一步是由编译器掌控. 然而C语言设计之初, 便是让我们对一切尽可能地掌握, 而一切不确定因子我们都不应该让它存在. 其次有个原则: 能自己做的就不要让编译器做.
为什么我们对参数放空(int main())置有不满? 在C语言中, 一个函数的参数列表有三种合法形态:
int function();
int function(void);
int function(int arg_n);
int function(int arg_n, ...);
第一种代表拥有未知个参数; 第二种代表没有参数; 第三种代表有一个参数; 第四种代表拥有未知个参数, 并且第一个参数的类型为int. 未知参数在C语言中有一个解决方案就是: 可变长的参数列表, 具体参考C标准库. 在此我们解释的依据是: 我们要将一切都掌控在自己手中, 我们不在括号内填写参数, 代表着我们认为一开始它的意思是它为空. 正因为如此, 我们就应该明确地说明它为void, 而不应该让它成为一个未知参数长度的函数. 否则在你不小心传入参数的时候, 编译器也无法发现错误.
int main(int argc, char* argv[]) 和 int main(void) 才是我们该写的C语言标准形式.
<二>
1. 对于缩进: 除了编译器提供的符号缩进之外, 我们可以自己给自己一个规范(请少用或者不用Tab键). 比如每块代码相较于上一块代码有4个的缩进.
2. 对于学习C语言, 请使用*.c 文件以及C语言编译器练习或编写C程序. 请不要再使用C++的文件编写C语言程序, 并且自圆其说为了效率而在C语言中使用C++的特性. C语言于C++有许多不同的地方. 兴许有人说C++是C的超集, 但笔者并不这么认为. 一门语言的出现便有它的意义所在, 关键在于我们如何发挥它的最大优势, 而不是通过混淆概念来增强实用性.
3. 对于一个代码而言, 我们应该注意让其变得清晰:
1) 等号两边使用空格: int complex_int = ;
2) 使用多个变量的声明定义, 或者函数声明定义, 函数使用时, 注意用空格分开变量. 对于一个清晰的程序而言, 我们要让每一个步骤清晰且有意义, 这就要求我们在编写程序的时候尽量让代码看起来结构化, 或者整体化. 尽量让每个程序式子为一行, 如果有特别的需要让多个式子写在同一行, 可以使用逗号","操作符来进行组合, 但是这样会让程序更难理解, 日后调试时也更难发现错误.
4. C代码规范:
1) 函数命名: C语言中, 我们可以让下划线或者词汇帮助我们表达函数:
前缀: ①set 可以表示设置一个参数为某值; ②get 可以表示获取某一个参数的值; ③is 可以表示询问是否是这种情况;
后缀: ①max/min 可以表示某种操作的最大/最小次数; ②cnt 可以表示当前的操作次数; ③key 表示某种关键值.
需要注意的是, 不要让命名过于赘述其义, 只简单地保留动作以及目的即可, 详细功能可以通过文档来进行进一步解读.
2) 结构体命名: 由于结构体的标签,不会污染命名, 即标签不在命名搜索范围之内, 所以可以放心使用. 有人习惯用typedef, 而有人喜欢用struct tag obj, 后者比较多, 但前者也不失为一种好方法, 仁者见仁智者见智.
/* 方法一*/
struct inetaddr_4
{
int port;
char *name;
};
struct inetaddr_4 *addr_info; /* 方法二*/
typedef struct_addr
{
int port;
char *name;
}inetaddr_4;
inetaddr_4 *addr_info_2;
二者处于同一文件中亦不会发生编译错误.
3) 变量命名:
①所有字符都使用小写; ②含义多的可以用_进行辅助; ③以=为标准进行对齐;
④类型, 变量名左对齐; ⑤等号左右两端, 最少有一个空格;
⑥为了防止指针声明定义时出错, 将*紧贴变量名;
⑦全局变量能少用就少用, 必须要用的情况下, 可考虑添加前缀g_.
4) #define命名:
①所有字符都用大写, 并且使用_进行分割;
②如果多于一个语句, 使用do{...}while(0)进行包裹, 防止;错误.
enum命名:
①所有字符都用大写, 并且用_进行分割;
②与define相比, enum适用于同一类型的常量声明, 而不是单一独立的常量, 往往成组出现.
5) 花括号: 当作用域超过一个屏幕时, 可以适当使用注释来指明{}作用域. 如果是代码量少的情况, 但嵌套比较多, 也可以使用这个方法来进行注释.
while()
{
if(tmp==NULL)
{
break;
}
else if(fanny==)
{
...//大概超过了一个屏幕的代码
}/* else if fanny*/
}/* end while*/
如果某个循环带着空语句, 使用{}进行挂载, 以免出现意外.
while(*is_end++ !='\0')
{
;
}
虽然是空的循环体, 但是写出来以免造成误循环.
6) 其他
①使用#if 而不是#ifdef , 可以使用define()来代替#ifdef 的功能:
#if !define(USER_DEFINE)
#define USERS_DEFINE...
#endif
②对于某些大段需要消除的代码, 我们不能使用注释/**/, 因为注释内不能内嵌着注释(//除外), 我们可以使用黑魔法:
#if NOT_DECLARATION
/**需要注释的代码**/
#endif
③不要使用毫无标记的纯数字,而应该用#define给它一个名字, 来说明这个数字的意义.
C语言编码风格_集锦_1的更多相关文章
- R 语言编码风格指南
R 语言是一门主要用于统计计算和绘图的高级编程语言.这份 R 语言编码风格指南旨在让我们的 R代码更容易阅读.分享和检查.以下规则系与 Google 的 R 用户群体协同设计而成. 概要: R编码风格 ...
- 来自 Google 的 R 语言编码风格指南
来自 Google 的 R 语言编码风格指南R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读.分享和检查. 以下规则系与 Google ...
- JavaScript编码风格指南(中文版)
前言: 程序语言的编码风格对于一个长期维护的软件非常重要,特别是在团队协作中.如果一个团队使用统一规范的编码分风格,可以提高团队的协作水平和工作效率.编程风格指南的核心是基本的格式化规则,这些规则决定 ...
- Java 下一代: 函数式编码风格——Groovy、Scala 和 Clojure 共享的函数结构及其优势
原文地址 本文内容 命令式处理 函数式处理 函数式编程的优势 所有 Java 下一代语言都包括函数式编程结构,让您可以从一个更高的抽象层面来思考问题.然而,语言间术语的不同使得难以看到类似的结构.本期 ...
- python编码你需要知道的编码风格
此时你已经可以写一些更长更复杂的 Python 程序,是时候讨论一下 编码风格 了.大多数语言可以写(或者更明白的说, 格式化 )作几种不同的风格.有些比其它的更好读.让你的代码对别人更易读是个好想法 ...
- Python入门基础:代码的编码风格
每种语言都有自己的编码风格,对于Python这种比较注重于空格的影响的代码而言,其风格也是相当重要的. 主要包括以下几点: 1:使用 4 空格缩进,而非 TAB .在小缩进(可以嵌套更深)和大缩进( ...
- Android 编码风格规范,很赞哦
1. 前言 这份文档参考了 Google Java 编程风格规范和 Google 官方 Android 编码风格规范.该文档仅供参考,只要形成一个统一的风格,见量知其意就可. 1.1 术语说明 在本文 ...
- Uber Go 语言编码规范
Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter.其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap.jaeger 等.2 ...
- Nim编码风格
介绍 Nim语言不限制开发人员使用哪种具体的编码风格, 但为了社区的发展,在编写一些标准库的时候还是应该遵从统一的编码风格 这篇文章会列出一系列的编码风格准则,供大家参考. 但值得注意的是,有很多例外 ...
随机推荐
- IOS8 : UIAlertController
UIAlertController 和 UIAlertAction 用法: 1. 最简单的提醒视图: 这里我们实现一个最简单的提醒视图,包含1个标题,1行信息,1个按键,按下按键后,什么都不发生: ...
- 无向图的完美消除序列 判断弦图 ZOJ 1015 Fish net
ZOJ1015 题意简述:给定一个无向图,判断是否存在一个长度大于3的环路,且其上没有弦(连接环上不同两点的边且不在环上). 命题等价于该图是否存在完美消除序列. 所谓完美消除序列:在 vi,v ...
- 初探Lambda表达式/Java多核编程【4】Lambda变量捕获
这周开学,上了两天感觉课好多,学校现在还停水,宿舍网络也还没通,简直爆炸,感觉能静下心看书的时间越来越少了...寒假还有些看过书之后的存货,现在写一点发出来.加上假期两个月左右都过去了书才看了1/7都 ...
- 利用IIS和Nginx实现负载均衡
一直对Nginx反向代理和负载均衡感兴趣,今天在Windows下搭建了一个简单实例.步骤如下: 1.下载Nginx,我下载的是最新的1.11.10版本,地址http://nginx.org/downl ...
- cookie跨域和js跨域问题
js跨域:主机名,协议,端口号只要有任何一个不同,就不能成立
- C# TCP多线程服务器示例
前言 之前一直很少接触多线程这块.这次项目中刚好用到了网络编程TCP这块,做一个服务端,需要使用到多线程,所以记录下过程.希望可以帮到自己的同时能给别人带来一点点收获- 关于TCP的介绍就不多讲,神马 ...
- javascript string对象方法总结
1.anchor() 用于创建html锚,也就是a标签,()中可以带参数,是a标签的name属性值. var string="hello world"; document.writ ...
- KMP算法的优化与详解
文章开头,我首先抄录一些阮一峰先生关于KMP算法的一些讲解. 下面,我用自己的语言,试图写一篇比较好懂的 KMP 算法解释. 1. 首先,字符串"BBC ABCDAB ABCDABCDABD ...
- Swift应用案例 1.无限轮播
从今天开始,我学习的重点开始转向Swift,并且会分享一些自己学习的心得体会,今天给大家带来的的是无限轮播.广告页的无限轮播是非常常见的一个功能,大多数APP都有,大多数程序员也都实现过,今天我们 ...
- ajax(省,市,县)三级联动
下面我们用Jquery,ajax,做一个省,市,县的三级联动: 下面是我做三级联动下拉的步骤以及逻辑 第一步:先做一个省市区表格 第二步:建个PHP页面显示用我是在<body>里放< ...