C/C++代码格式规则中比较有争议的几处

jackyjkchen 2009-10-25 09:47:08
从一个人的代码格式,其实可以猜出此人的C/C++大致水平,凡是写过正式项目的人,代码风格不会太差的,有些代码风格规则得到了普遍认同,有些确仍存争议。

下面列举一些仍存争议的代码风格。


1.空参数的函数是否得用fuc(void)格式
多次在一些书里看到空参数的函数得用void来填补形参表,但是在实际编程以及见到过的许多项目里——无论是开源项目还是微软的一些库,fuc()仍然是很普遍的写法。
观点:是否加void对于代码逻辑本身没有任何影响,可读性上差别也不大,除非项目硬性要求或者初学的时候养成了习惯,个人感觉是不是一定要加void不那么重要。正因为如此,fuc()仍然大行其道,通常也不被看做明显的风格缺陷。

2.大括号的对齐

if()
{

}

if(){

}

这两种代码那种风格更好呢?VC、VA、Eclipse的自动格式化倾向于前者,但是有许多开源项目和教材上的代码又明显是由后者,谁优谁劣恐怕又要牵涉到操作系统和编程环境的口水仗了……很明显,微软提倡的代码风格明显属于前者,而后者在开源项目中大量出现。
观点:入乡随俗,在VC里写后者不伦不类,跟着VS+VA的自动格式化走吧;Linux下倒是随便,看项目组整体的要求。

3.单行循环和单行条件的大括号是否省略
一般书上说任何时候都加大括号是比较好的选择。当然,保证没有歧义的情况下(主要是if、else的歧义),不加括号也能让代码显得更紧凑。
提到这点主要是反驳一个观点——有人说加不加括号会造成效率差别……这完全是无稽之谈,经过测试,在VS2008中,无论什么优化选项,单行循环加不加括号生成的汇编代码都是一样的,如果你是TC测出的效率差别,那只能说编译器太烂了!
观点:我个人的观点倒不像书上那么绝对(任何时候都加)。我感觉条件语句加括号避免歧义是应该的;而单行循环一般没有歧义,而且不加括号显得很紧凑,我推荐不加;那种多层的循环和条件,加括号增加可读性,最好加上。

4,变量初始化
本来没有任何争议,但是无论谭浩强的书还是“权威”的K&R的书做的都不好,才造成了许多人认为不初始化才是“权威”。
观点:没什么说的,不初始化的人一看就知道没写过几行代码,没有为那种因为不初始化而造成的bug烦恼过。

5.变量声明位置
由于受变量位置较严格的C标准影响,许多人似乎喜欢在头部一股脑的把变量声明完。这自然是有道理的,纯C编译器要求这样声明(比如VS2005、VS2008加上/TC选项或者使用extern "C")。不过C++里的兼容的C就没这个限制了,因为C++可能有较大的自定义类型,开始就声明有效率损失。
观点:请看你的编译器,C++的自由方式自然好,但如果编译器限制就没办法了。我提醒注意的是,如果C++方式编译,就没有必要死抱C的声明格式了。

6.短代码的换行

i++;j--;
{return 0;}
。。。。。

在项目代码中我们经常能看到这样的代码,因为短小,就没有换行了。
观点:我看这种代码总是不舒服,特别是那个return 0;我宁可直接把括号去了……
...全文
458 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
morilasi 2009-10-26
  • 打赏
  • 举报
回复
func()和func(void)不同之处在于,func()在C中被当作参数个数不定,在C++中被当作无参数
而func(void)在C及C++中都被当作无参数
所以提倡func(void)写法。
其实我个人感觉这个问题也不大。。
云梦谭 2009-10-26
  • 打赏
  • 举报
回复
在同一项目组里,最好有个规约。在项目组内部统一,至少代码复审时大家读起来都轻松
hua_cai 2009-10-25
  • 打赏
  • 举报
回复
统一有统一的好,不统一换个人改的很痛苦。
pcboyxhy 2009-10-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jackyjkchen 的回复:]
不得不说的是,C99是个尴尬的标准,商业编译器没几个理他
[/Quote]

可惜的是,互联网,高性能计算等领域,没几个理会那些编译器
butwang 2009-10-25
  • 打赏
  • 举报
回复
看项目要求了,其他时候随意,有时用个也用用goto
jackyjkchen 2009-10-25
  • 打赏
  • 举报
回复
不得不说的是,C99是个尴尬的标准,商业编译器没几个理他
jackyjkchen 2009-10-25
  • 打赏
  • 举报
回复
4. 定义时初始化就更无必要了。
int i=0;
for (; i <10; i++

int i;
for(i=0; i <10; i++)

for(int i=0; i <10; i++)
第三种看起来是最好理解的。
定义时初始化,无法保证在使用的时候,是否没被修改过,所以使用时再初始化效果更好。
当然也没有严格死板的规矩,一切还要看具体场合。


5. 纯C没有要求变量在一开始就声明完,以下是C标准第124页抄来的一段代码。
C/C++ codevoid copyt(int n)
{
typedefint B[n];// B is n ints, n evaluated now n+=1;
B a;//a is n ints, n without += 1int b[n];// a and b are different sizesfor (int i=1; i< n; i++)
a[i-1]= b[i];
}
[/Quote]

4.你理解错了,不是循环,而是数组和整数等。
如果你也经常写一些文件处理、加密解密的东西,不会认为char a[129] = {0};中的那个={0}没有必要!

5.我不知道你这是C89还是C99,C89的编译器你试试瞧。
pcboyxhy 2009-10-25
  • 打赏
  • 举报
回复
1. 两者是等价的,标准也认可,所以谈不上缺陷。

2. {跟if处于同一行有一个很大的好处,就是(){}很多的代码中,
一屏幕可以显示更多的行数,减少上下翻页次数,阅读起来更省力。

3. 一般不需要加,除非不加影响代码阅读,理解起来费力。

4. 定义时初始化就更无必要了。
int i=0;
for (; i<10; i++

int i;
for(i=0; i<10; i++)

for(int i=0; i<10; i++)
第三种看起来是最好理解的。
定义时初始化,无法保证在使用的时候,是否没被修改过,所以使用时再初始化效果更好。
当然也没有严格死板的规矩,一切还要看具体场合。



5. 纯C没有要求变量在一开始就声明完,以下是C标准第124页抄来的一段代码。
void copyt(int n)
{
typedef int B[n]; // B is n ints, n evaluated now
n+=1;
B a;//a is n ints, n without += 1
int b[n]; // a and b are different sizes
for (int i = 1; i < n; i++)
a[i-1] = b[i];
}
phpjspasp 2009-10-25
  • 打赏
  • 举报
回复
没有必要统一啊。
astyle有的还有几个选项呢。
--style=ansi ANSI style formatting/indenting.

--style=kr
Kernighan&Ritchie style formatting/indenting.

--style=gnu
GNU style formatting/indenting.

--style=java
Java mode, with standard java style formatting/indenting.

--style=linux
Linux mode (i.e. 8 spaces per indent, break definition-block
brackets but attach command-block brackets).
以上五种是astyle格式化代码的选项。
  • 打赏
  • 举报
回复
:D
wuyu637 2009-10-25
  • 打赏
  • 举报
回复
代码风格只是一种习惯,没有必要完全统一
内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++无处不在,内存泄漏几乎在每个C++程序都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能。本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题。 内容预览: 1 内 存管理 1.1 C++内存管理详解 1.1.1 内存分配方式 1.1.1.1 分配方式简介 1.1.1.2 明确区分堆与栈 1.1.1.3 堆和栈究竟有什么区别? 1.1.2 控制C++的内存分配 1.1.2.1 重载全局的new和delete操作符 1.1.2.2 为单个的类重载 new[ ]和delete[ ] 1.1.3 常见的内存错误及其对策 1.1.4 指针与数组的对比 1.1.4.1 修改内容 1.1.4.2 内容复制与比较 1.1.4.3 计算内存容量 1.1.5 指针参数是如何传递内存的? 1.1.6 杜绝“野指针” 1.1.7 有了malloc/free为什么还要new/delete? 1.1.8 内存耗尽怎么办? 1.1.9 malloc/free的使用要点 1.2 C++的健壮指针和资源管理 1.2.1 第一条规则(RAII) 1.2.2 Smart Pointers 1.2.3 Resource Transfer 1.2.4 Strong Pointers 1.2.5 Parser 1.2.6 Transfer Semantics 1.2.7 Strong Vectors 1.2.8 Code Inspection 1.2.9 共享的所有权 1.2.10 所有权网络 2 内存泄漏 2.1 C++动态内存分配引发问题的解决方案 2.2 如何对付内存泄漏? 2.3浅谈C/C++内存泄漏及其检测工具 2.3.1 内存泄漏的定义 2.3.2 内存泄漏的发生方式 2.3.3 检测内存泄漏 2.3.3.1 VC下内存泄漏的检测方法 2.3.3.2 使用BoundsChecker检测内存泄漏 2.3.3.3 使用Performance Monitor检测内存泄漏 3 探讨C++内存回收 3.1 C++内存对象大会战 3.1.1 基本概念 3.1.2 三种内存对象的比较 3.1.3 使用栈对象的意外收获 3.1.4 禁止产生堆对象 3.1.5 禁止产生栈对象 3.2 浅议C++ 的垃圾回收方法

69,394

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧