参考原地址:

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的更多相关文章

  1. R 语言编码风格指南

    R 语言是一门主要用于统计计算和绘图的高级编程语言.这份 R 语言编码风格指南旨在让我们的 R代码更容易阅读.分享和检查.以下规则系与 Google 的 R 用户群体协同设计而成. 概要: R编码风格 ...

  2. 来自 Google 的 R 语言编码风格指南

    来自 Google 的 R 语言编码风格指南R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读.分享和检查. 以下规则系与 Google ...

  3. JavaScript编码风格指南(中文版)

    前言: 程序语言的编码风格对于一个长期维护的软件非常重要,特别是在团队协作中.如果一个团队使用统一规范的编码分风格,可以提高团队的协作水平和工作效率.编程风格指南的核心是基本的格式化规则,这些规则决定 ...

  4. Java 下一代: 函数式编码风格——Groovy、Scala 和 Clojure 共享的函数结构及其优势

    原文地址 本文内容 命令式处理 函数式处理 函数式编程的优势 所有 Java 下一代语言都包括函数式编程结构,让您可以从一个更高的抽象层面来思考问题.然而,语言间术语的不同使得难以看到类似的结构.本期 ...

  5. python编码你需要知道的编码风格

    此时你已经可以写一些更长更复杂的 Python 程序,是时候讨论一下 编码风格 了.大多数语言可以写(或者更明白的说, 格式化 )作几种不同的风格.有些比其它的更好读.让你的代码对别人更易读是个好想法 ...

  6. Python入门基础:代码的编码风格

    每种语言都有自己的编码风格,对于Python这种比较注重于空格的影响的代码而言,其风格也是相当重要的. 主要包括以下几点: 1:使用 4 空格缩进,而非 TAB  .在小缩进(可以嵌套更深)和大缩进( ...

  7. Android 编码风格规范,很赞哦

    1. 前言 这份文档参考了 Google Java 编程风格规范和 Google 官方 Android 编码风格规范.该文档仅供参考,只要形成一个统一的风格,见量知其意就可. 1.1 术语说明 在本文 ...

  8. Uber Go 语言编码规范

    Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter.其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap.jaeger 等.2 ...

  9. Nim编码风格

    介绍 Nim语言不限制开发人员使用哪种具体的编码风格, 但为了社区的发展,在编写一些标准库的时候还是应该遵从统一的编码风格 这篇文章会列出一系列的编码风格准则,供大家参考. 但值得注意的是,有很多例外 ...

随机推荐

  1. 2017年2月16日-----------乱码新手自学.net 之MVC模型

    第二篇博文,最近学习的内容还是回到了正题:ASP.NET MVC5之上.虽然EF学了个一知半解,但是用这点知识,看MVC5的MODEL部分应该还是够了.尽管周末还要恶补一下EF才行. (一)MVC简述 ...

  2. lambda表达式查询经验:IN 和groupby的使用

    lambda In的用法: lambda表达式查询没有IN这个方法,可以变通一下,in查询的数组是否包含在映射对象里面的集合里: 如下代码: var departmentIDs = input.Dep ...

  3. BZOJ 3924: [Zjoi2015]幻想乡战略游戏(动态点分治)

    这种动态点分治嘛,GDKOI时听打到了,也有同学讲到了,所以印象比较深刻也就想出来了,然后就在实现方面卡了好久= = 不得不说CLJ说得真的太简单了,实现方面根本没提. 首先我们可以先用树分治构建出这 ...

  4. Asp.net mvc 4.0 高级编程 百度云下载

    Asp.net mvc 4.0 高级编程 百度云下载地址:链接:http://pan.baidu.com/s/1o6zFvOe 密码:xyss 1.基于 ASP.NET MVC4.0 + WebAPI ...

  5. FineUIMvc随笔 - 不能忘却的回发(__doPostBack)

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 用户反馈 有网友在官方论坛抛出了这么一个问题,似乎对 FineUIMvc 中的浏览器端与服务器端的交互方式很有异议. 这里面的关 ...

  6. 视频直播SDK-ios版

    IOS视频直播接入说明 一.名词解释 分辨率:用于计算机视频处理的图像,以水平和垂直方向上所能显示的像素数来表示分辨率.常见视频分辨率的有1080P即1920x1080,720P即1080x720,6 ...

  7. MyBatis 源码分析——类型处理器

    官网上面讲到:无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型.那 ...

  8. Spring框架---Spring入门

    Spring入门 为了能更好的理解先讲一些有的没的的东西: 什么是Spring Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架 分层 SUN提供的EE的三层结构 ...

  9. MegaCli 安装过程

    首先说下自己遇到的坑: 百度搜索了一篇关于安装 MegaCli 的文章,于是乎就开始安装,装完之后获取不到 raid 的信息,后来发现是版本问题,就又搜索了一堆文章,最后搞定了 [root@web-0 ...

  10. [.net 面向对象程序设计深入](14)Redis——基础

    [.net 面向对象程序设计深入](14)Redis——基础 很长一段时间没更新博客了,坚持做一件事,真不是件容易的事,后面我会继续尽可能的花时间更新完这个系列文章. 因这个系列的文章涉及的范围太大了 ...