单词压缩编码c语言_C语言代码书写风格

81350a35f4ec8e8ffba6e3d181e79c23.png

相信经常coding的同学在项目中看别人的代码一定会像我一样的头痛,特别是有点强迫症的程序猿在看和自己风格差距较大的代码的时候内心甚至会出现烦躁和想去“改正”的念头。下面就为大家总结下一些常见的代码编程风格。

一、复合语句的对齐和缩进风格

(1). K&R风格,Kernighan和Ritchie共同完成C语言”白皮书”C Programing Language一书的时候使用的风格。由于此书被当时的C程序员誉为C语言圣经,所以此风格也被争相模仿。左边的花括号出现在行的末尾。通过缩进保持代码的紧凑,缺点是不容易找到左边的花括号:

if (line_num == MAX_LINES) {

line_num = 0;

page_num++;

}

(2).Allman风格,Eric Allman(sendmail和其他一些UNIX工具的作者)的姓氏命名的,每个花括号单独占一行。容易检查括号的匹配:

if (line_num == MAX_LINES)

{

line_num = 0;

page_num++;

}

(3). Whitesmiths风格,它是因为Whitesmith C编译器而普及起来的,规定花括号采用缩进形式。C++的同学在看STL代码的时候是否有似曾相识的感觉呢?

if (line_num == MAX_LINES)

{

line_num = 0;

page_num++;

}

(4). GUN风格,它用于GUN项目所开发的软件中,它对花括号采用缩进,然后再进一步缩进内层语句。喜欢Linux系统的同学在看一些工具的源码的时候应该会注意到:

if (line_num == MAX_LINES)

{

line_num = 0;

page_num++;

}

这四种不同的编码风格中,在国内使用最多的毫无疑问是K&R和Allman,以前C语言大行其道的时候很多事第一种,当更多的Java、C#、和C++语言流行的现在反而是第二种Allman风格的更多一些,当然Java里也有很多是K&R风格。如果是Windows平台由于VS的关系默认第二种缩进的关系还是Allman风格更多。

二、变量命名的风格和习惯

一般C语言的程序员在命名宏定义用全大写表示,多个单词使用下划线’_’来连接。

而变量的命名反而大致分成二种风格:

(1)驼峰命名法

多个单词连接成一个变量名的时候后面的单词每个单词的第一个字母大写的方式区分,比如:

lineNum

(2)下划线命名法

在多个单词的中间使用下划线来区分,比如:

line_num

驼峰命名法由于Java、C#和C++等一些语言的出现而流行一时,下划线命名法是早期C语言经常使用的方法,目前还有很多老的C语言程序猿喜欢下划线,可能觉得看起来更优美吧,至于帕斯卡等等一些命名方法就不提及了。

三、注释的风格

C语言在C89的时候只有/**/这一种注释可用,在C99的时候从C++等一些语言借鉴过来了//的注释方式。

这两种注释其实各有优缺点。

(1). /**/注释

在注释很多代码的时候异常方便,甚至还能注释出很多花样,比如翼型注释

/*此方法为翼型注释*/

/*******************************

* 盒型注释 *

******************************/

/*

* 盒型注释的简化版

*/

(2). //注释

在注释单行的时候特别方便,而且配合/* /注释进行嵌套注释也弥补了 /*/注释不能嵌套的缺点,而最主要的问题是//注释只会影响到单行,不会因为注释不当而引起很多行被注释掉的问题,当然在现在强大的IDE面前,很大注释都有方便的快捷键,一些注释的不方便也就荡然无存了。

四. C语言的函数无参数时是为void还是()?

经常看到一些C语言的代码,在函数没有参数的时候往往都是空着,写成(),但是这种写法对C语言来说其实是可以接受任何参数!你可能会很奇怪为什么这样设计,这也与开始设计C语言的初衷有关,在别的语言中完全不符合规范的东西在C中都是允许的。因为C是一个允许计算结果由实现定义的语言。也就是在特定的平台上编译、链接和执行允许具有不同的结果!如果大的自由度带来的可能就是更多的陷阱和错误的可能。

所以我个人觉得避开这些陷阱的最好方法是保持一个良性的C程序编码习惯和风格,比如在确定不需要参数的时候使用void代替()这种什么也不写,没有参数就确定的告诉编译器我不需要参数,千万不要和编译器玩暧昧!

当然这种情况在C++中已经不再存在,C++不管你写不写都是void!

五、switch这种复合语句改如何对齐?else如果嵌套?

(1) if else嵌套这个问题,说简单点,在需要的时候都添加上去吧。当然我个人有时候在只有一行的时候为了保持简洁的代码往往不添加花括号,那么在别人添加代码的时候就需要保持谨慎了!

if (i > 0 && i < 10)

if (i > 5)

printf("YES");

else

printf("i greater than 10!n");

为了让代码看起来简洁明快我们可能会写出这种代码,好吧,你可能会和我一样是一个由轻微强迫症的coder,代码风格就要”最好”的。哪怕一个个改也要和自己的风格一样,但是上述代码当i=2的时候是否会输出最后的i greater than 10?,答案是不会,C语言的else有个规则是子句应该属于离它最近的if。所以上述代码实际的缩进是:

if (i > 0 && i < 10)

if (i > 5)

printf("YES");

else

printf("i greater than 10!n");

导致意义完全不同了!

(2)swith的代码对齐风格

分支标号后面放置语句:

switch (value) {

case 1: printf("branch 1!");

break;

case 2 : printf("branch 2!");

break;

default:

}

如果每个分支只有一个简单的操作,break语句甚至可以和操作放在一行

switch (value) {

case 1: printf("branch 1!"); break;

case 2 : printf("branch 2!"); break;

default:

}

另外一种是把语句放在分支标号的下面,并且对语句进行缩进,从而凸显出分支标号:

switch (value) {

case 1:

printf("branch 1!");

break;

case 2 :

printf("branch 2!");

break;

default:

}

当每个分支语句都较为短小的时候采用第一种方式明显是个更好的选择,第二种方式更适合每个分支都很庞大的分支语句,当然这个时候可别忘了添加上花括号,否则编译器可是会提示你的!

总结:在实际项目中,如果你是项目技术的决策者则可以根据你自己的喜好和规范制定规则,并且让下面的人严格执行这套风格(想笑^^),如果不是还是老老实实的用项目的这套吧,千万别画蛇添足!当然如果私下写自己的代码则用自己喜欢的就行,有些风格的区别其实很难说好坏,始终如一的坚持一种风格就可以了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: __attribute__是C语言中的一个特殊关键字,用于指定变量、函数、类型等的特殊属性。它可以用于优化代码、控制内存对齐、指定函数调用约定等方面。常见的__attribute__属性包括:aligned、packed、noreturn、deprecated等。使用__attribute__可以提高代码的可读性、可维护性和可移植性。 ### 回答2: C语言中的__attribute__是一种非常有用的特殊组合,它提供了许多编译器相关的功能,例如:控制数据的对齐方式,指定函数的参数和返回值,显式地将变量放入指定的内存区域等等。 __attribute__的使用方式非常简单,只需要在需要使用的变量、函数、类型或其他实体的定义前添加__attribute__并指定要使用的属性即可。例如,在声明变量的时候使用__attribute__((align(16)))就可以将该变量的字节对齐方式设置为16个字节。 除此之外,__attribute__还提供了许多其他有用的选项。例如,可以使用__attribute__((noinline))防止编译器将函数内联以优化代码,或者使用__attribute__((warn_unused_result))强制函数返回值被检查。 值得注意的是,__attribute__是一种非标准化的C语言扩展,因此在使用时需要谨慎。不同的编译器厂商可能会实现不同的__attribute__属性,而且一些老旧的编译器可能完全不支持这种特性。因此,为了确保代码的可移植性,最好只在确信目标平台支持__attribute__的情况下才使用它。 总而言之,__attribute__是一个非常强大和有用的特性,它可以帮助开发人员优化代码,提高性能,并提供许多有用的编译时功能。如果正确使用,__attribute__可以极大地简化一些编程任务,并帮助开发人员创建更好的代码。 ### 回答3: C语言中的__attribute__是一个GCC扩展,可以用于给变量、函数、结构体等添加属性,以达到一些特定的目的。__attribute__主要包括以下几种属性: 1. __attribute__((packed)):将变量或结构体成员的对齐方式设置为紧凑型(即不留空隙),以节省空间。 2. __attribute__((aligned(n))):将变量或结构体成员的对齐方式设置为n字节对齐,通常用于优化访问速度。 3. __attribute__((noreturn)):标记一个函数不返回值,可以用于避免编译器产生不必要的警告。 4. __attribute__((section("section_name"))):将函数或变量放置在指定名称的代码节或数据节中,这对于实现动态链接库、操作系统内核等有重要作用。 5. __attribute__((unused)):标记一个变量或函数未使用,可以避免编译器产生警告。 6. __attribute__((weak)):将函数或变量设置为弱定义符号。如果在程序中存在多个符号名称相同但定义内容不同的情况,链接器会选择其中具有强符号定义的符号,若都为弱符号定义,则会选择其中一个。 除此以外,__attribute__还有许多其它用法,不同的GNU扩展编译器也会提供一些特有的__attribute__用于辅助编写高效的代码。 需要注意的是,__attribute__是GCC的扩展特性,在C语言标准中并未定义,因此在使用时需要考虑兼容性问题。在使用时应该根据不同的编译器和平台,选择合适的__attribute__以避免产生错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值