01不同的语言风格

当今世界上一共有5000多种语言。不同的国家、民族和地区,说着不同的语言。每个民族不一定有自己的文字,但一般都会有自己的语言。即使是同一种语言,在不同的时代、不同的地区和群体,说话的方式和语言风格也各不相同。同样是刘备《三顾茅庐》的故事,如果换成不同的人去说,你会发现说话方式和语言风格大相径庭:

TVB腔:呐,做人呢,最重要的是开心。玄德你饿不饿,我煮碗面给你吃。

日系风:玄德桑是怀着对天下美好的期盼来的吧,真是让人无法拒绝呢。

欧美翻译腔:噢!上帝!你怎么来三次了!我对上帝发誓,我不是故意要你等的!

东北腔:艾玛!您来就来吧,您还来三次,这整滴啥玩意儿啊?快进来吧,都哆嗦了。

班主任腔:让你来三次,是为了你好!以后你就知道了!

知乎大V风:谢邀,人在南阳,刚下飞机。作为卧龙岗小透明,圈子小熟人多所以先匿了。一觉起来这么多赞,看到玄德兄等了这么久,又实名反对高赞答案,不知能否私信分享下:吃了三次闭门羹是一种怎样的体验?

如果换成郭敬明,话风可能又变成这样:在这无尽的寂寞里,时间化为了灰烬,大雪逆转了天地。而我在这里静静地等待,等待宿命之轮开启它的轮转。我知道你一定会再来,第三次,玄德,我会让你,自由地…

02C语言的编程风格

C语言也是一种语言,同样可以匹配语言的基本三要素:语音、词汇和语法。同样是C语言编程,不同的平台、项目、公司、社群,编码风格也是风格迥异,各不相同。

在Windows下编写一个C语言函数,我们通常使用下面的命名方式:

void OpenDoor(void);

而在Linux下编写一个C语言函数,我们更喜欢使用下面的命名方式:

void open_door(void);

而同样是在Linux环境下,如果是一个GNU项目,函数的命名通常又变成了这样:

voidopen_door (void);

不同的开发环境,不同的平台,不同的公司,不同的项目,编程规范和代码风格可能各不相同,我们需要遵守的原则其实也很简单:入乡随俗。

03Linux内核编码风格

在Linux内核源码的Documentation/process/coding-style.rst文件里,详细讲述了Linux内核编程时需要遵循的一些编程规范。

1.缩进

代码的缩进使用tab键,建议是8个空格

大家在编写代码时,缩进要使用tab键,而不是直接敲4个或8个空格。tab键的缩进可以通过IDE的选项调节,也可以在vim的vimrc配置文件中设置。使用tab键缩进8个空格,可以让代码的层次结构更加清晰,但带来的弊端是当程序嵌套的层次很深时,缩进会使每一行写代码的空间大大减少。为了预防这种情况发生,在Linux内核源码的switch-case语句中,case语句一般都是和switch顶格写,不缩进。

2.空格

在Linux内核中,使用空格的地方主要分布如下

  • 在if、switch、case、for、do、while后,和(之间要加一个空格

  • 二元运算符:+、-、|、*、=、== 等两侧一般要加空格

  • 函数名、一元运算符++、--等后面一般不用加空格

  • 小括号里表达式的两侧一般不要加空格

  • sizeof、typeof、alignof、__attribute__后面一般不要加空格

3.换行

一般在if、switch、case、for、do、while后的大括号不能单独占一行,但函数的一对大括号可以单独各占一行。函数的参数一行写不下,可以换行写,各个函数之间一般也要空一行。

在if-else分支结构中,else分支和大括号一般不会单独占一行,而是和if分支的}写在同一行。

04格式化工具:indent

Linux提供了一个好用的工具:indent,可以对我们编写的C语言代码进行格式检查。indent的安装和使用都很方便:

# apt install indent# indent -linux -ce hello.c

indent默认的风格是GNU,如果你编写的程序代码很乱,没有留空格,没有换行,没有缩进,阅读性很差,如下所示:

我们使用上面的indent命令对这段代码进行处理后,再次使用vim打开,你会发现代码风格就变成了下面这个样子,瞬间整洁了不少:

在 indent -linux  -ce main.c命令中,-linux参数表示按照Linux风格来格式化代码:空格、缩进按照内核的规范,大括号不单独占一行。-ce参数表示else分支不单独占一行,如果你使用-nce参数,else分支则会单独占一行。

除此之外,indent工具还有很多可选参数供我们参考,你可以通过indent --help或man indent命令来查看这些参数的详细使用说明。

如果你想有自己的编码风格,你可以将这些格式化参数保存在~/.indent.pro文件中。以后你每次使用indent xx.c格式化一个C文件时,indent就会根据这个配置文件中保存的参数来格式化xx.c文件。

Linux内核源码中的scripts/Lindent脚本,可以对Linux内核代码进行格式化设置。这个Lindent脚本内部其实也是通过调用indent命令来运行的。

05小结

以上给大家介绍了Linux内核中的代码风格和格式化工具indent的使用。由于篇幅关系只介绍了其中一小部分,更多的编码规范和细节可以去阅读内核源码中的Documentation/process/coding-style.rst文档。

linux内核_Linux内核编程风格简介相关推荐

  1. linux内核_Linux驱动编程的本质就是Linux内核编程

    由于Linux驱动编程的本质属于Linux内核编程,因此我们非常有必要熟悉Linux内核以及Linux内核的特点. 这篇文章将会帮助读者打下Linux驱动编程的基础知识. 本篇文章分为如下三个小节进行 ...

  2. linux 线程_Linux 多线程编程(不限Linux)

    前言 线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步.互斥,这些东西将在本文中介绍.我在某QQ群里见到这样一道面试题: 是否熟 ...

  3. linux 线程_Linux线程编程专题之线程和线程函数介绍

    ---其实经过这一段时间的Linux应用编程学习,自己总结发现到,在Linux应用编程当中有四大模块我们一定要掌握(这些是最基础的东西): 多进程编程 多线程编程(用的比较多) I/O多路复用 soc ...

  4. linux 负数_linux内核提权系列教程(2):任意地址读写到提权的4种方法

    一.漏洞代码分析 代码见arbitrary.h. 1.功能函数介绍 功能 输入结构名 输入结构 功能 ARBITRARY_RW_INIT init_args size 初始化全局对象,存于g_mem_ ...

  5. 和linux关系_Linux内核Page Cache和Buffer Cache关系及演化历史

    在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘.这里提到的脏页(dirty ...

  6. int linux 原子操作_linux c++编程之多线程:原子操作如何解决线程冲突

    在多线程中操作全局变量一般都会引起线程冲突,为了解决线程冲突,引入原子操作. 1.线程冲突 #include #include #include #include int g_count = 0;vo ...

  7. Linux设备驱动开发详解【三】_Linux 内核及内核编程

    本文简介 由于 Linux 驱动编程本质属于 Linux 内核编程,因此有必要掌握 Linux 内核及内核编程的基础知识.         3.1-3.2 节讲解 Linux 内核的演变及 Linux ...

  8. Linux 内核编程风格

    Linux 内核编程风格 (518 个字於此篇帖子) (已阅读: 1177 次) 这篇短小的文章是对Linux内核编程风格的建议.编程风格非常的个性化,而且,我并不想将我的观点强加给任何人,但是为了变 ...

  9. linux内核调用( )为进程创建虚存区_Linux内核分析-总结篇(九)

    本次内容作为Linux内核的总结内容,主要涉及对Linux系统的总体的一些理解,同时将之前的一些总结贴出来作为大家的一个索引,希望笔者一样的菜鸟有一些帮助和入门的作用.从一个初学者的角度对Linux有 ...

最新文章

  1. C语言初步学习(适合与学习过C++和java的童鞋)
  2. 周鸿祎重做路由器,到底在做什么?
  3. 设计模式-简单工厂模式
  4. BJUI验证后弹窗不显示
  5. vSphere资源:下载及文档地址
  6. 应用程序窗口hwnd初始化_Golang OpenGL 跨平台图形程序开发(2)你好,窗口
  7. java焦点图_javascript焦点图(能够自己主动切换 )
  8. cmake学习(二)常用变量和常用环境变量
  9. PHP json_encode中文乱码解决方法
  10. 简单解决网课或教育平台在线学习视频鼠标检测问题
  11. K8s简述NodePort
  12. 一年级计算机算文具吗,一年级老师说,用这样文具的孩子,课堂上都没有认真听讲...
  13. 通过Python计算经纬度点任意角度任意距离的经纬度点
  14. MXNet中take函数的用法
  15. PostgreSQL存储过程-批量新增周末到节假日
  16. 【NodeJS】安装
  17. 【业务分析】如何设计A/B test,以及如何对实验结果检验、结果分析?
  18. 安川机器人报错_安川机器人报错代码:安全模式的变更和用户口令的变更
  19. python selenium的xpath的使用
  20. Java方法的概述、格式说明和调用

热门文章

  1. nova8pro能升级鸿蒙吗,华为将有48款产品可以升级到鸿蒙 2.0系统
  2. 测试网络的带宽指令_单机千万级MQTT服务器测试报告
  3. alien指令 linux,使用alien命令让deb包和rpm包互相转换
  4. 向上传文件服务器,向服务器上传文件
  5. jar包导出无法显示图片或者音乐_如何制作图片视频短片,配上音乐闪耀朋友圈!...
  6. LDAP命令介绍---dstune
  7. rebase参数以及注意事项
  8. JDK源码解析之java.util.AbstractCollection
  9. C#提取文件名【C#】
  10. UVA340 ​​​​​​​Master-Mind Hints【数组】