《Linux 高级程序设计(第三版)》——1.4 Linux下编码风格

1.4 Linux下编码风格

Linux 高级程序设计(第三版)
下面为读者列出GNU编码规范和Linux内核编码规范示例。

1.4.1 GNU编码规范
下面是GNU emacs中的一段代码。

/* Interface from Emacs to terminfo.
     Copyright (C) 1985, 1986 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.
GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING.  If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
#include <config.h>
#include "lisp.h"
/ Define these variables that serve as global parameters to termcap, so that we do not need to conditionalize the places in Emacs that set them.  /
char UP, BC, PC;
/ Interface to curses/terminfo library. Turns out that all of the terminfo-level routines look    like their termcap counterparts except for tparm, which replaces tgoto.  Not only is the calling sequence different, but the string format is different too./
char *tparam (string, outstring, len, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
char *string;
char *outstring;
int arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9;
{
  char *temp;
  extern char *tparm();
  temp = tparm (string, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
  if (outstring == 0)
      outstring = ((char *) (xmalloc ((strlen (temp)) + 1)));
  strcpy (outstring, temp);
  return outstring;
}

分析上面的代码可以看出GNU具有如下编码风格。

函数开头的左花括号放到最左边,避免把任何其他的左花括号、左括号或者左方括号放到最左边。
尽力避免让两个不同优先级的操作符出现在相同的对齐方式中。
每个程序开头都应该有一段简短的说明其功能的注释。例如GNU emacs上面的代码中的注释。
每个函数都加上注释,以说明函数做了些什么,需要哪些种类的参数,参数可能值的含义以及用途。
不要跨行声明多个变量。在每一行中都以一个新的声明开头。
当在一个if语句中嵌套了另一个if-else语句时,应用花括号把if-else括起来。
要在同一个声明中同时说明结构标识和变量,或者结构标识和类型定义(typedef)。
尽量避免在if的条件中进行赋值。
在名字中使用下划线以分隔单词,尽量使用小写;在宏或者枚举中通常使用大写常量。
使用一个命令行选项时,给出的变量应该在选项含义的说明之后,而不是选项字符之后。
另外,Linux有很多工具来帮助程序员养成良好编码规范。除了vim和emacs以外,还有indent工具可以帮程序员美化C/C++源代码。下面用这条命令可将Linux内核编程风格的程序quan.c转变为GNU编程风格。

[root@localhost ~]#$ indent -gnu quan.c
1.4.2 Linux内核编码规范
下面是Linux内核2.6.13目录\arch\i386\kernel中的numaq.c的节选代码,现在并不要求读懂此代码,而是看Linux的内核编程风格。

/*
 * Written by: Patricia Gaughen, IBM Corporation
 *
 * Copyright (C) 2002, IBM Corp.
 *
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 * NON INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 * Send feedback to <gone@us.ibm.com>
 */
#include <linux/config.h>
#include <linux/mm.h>
#include <linux/bootmem.h>
#include <linux/mmzone.h>
#include <linux/module.h>
#include <linux/nodemask.h>
#include <asm/numaq.h>
#include <asm/topology.h>
#include <asm/processor.h>
#define MB_TO_PAGES(addr) ((addr) << (20 - PAGE_SHIFT))
/*
* Function: smp_dump_qct()
*
* Description: gets memory layout from the quad config table.  This
* function also updates node_online_map with the nodes (quads) present.
*/
static void __init smp_dump_qct(void)
{
int node;
struct eachquadmem *eq;
         struct sys_cfg_data scd = (struct sys_cfg_data )__va(SYS_CFG_DATA_PRIV_ADDR);
nodes_clear(node_online_map);
for_each_node(node) {
               if (scd->quads_present31_0 & (1 << node)) {
                        node_set_online(node);
                        eq = &scd->eq[node];
                         / Convert to pages /
                         node_start_pfn[node] = MB_TO_PAGES(
                                eq->hi_shrd_mem_start - eq->priv_mem_size);
                      node_end_pfn[node] = MB_TO_PAGES(
                                eq->hi_shrd_mem_start + eq->hi_shrd_mem_size);
                memory_present(node,
                                node_start_pfn[node], node_end_pfn[node]);
                         node_remap_size[node] = node_memmap_size_bytes(node,
                                                          node_start_pfn[node],
                                                          node_end_pfn[node]);
        }
       }
}

分析以上代码可以看出Linux内核代码具有如下风格。

缩进采用tab制表符。
在if或者for循环中,将开始的大括号放在一行的最后,而将结束大括号放在本段语句结束行的第一位,函数中的大括号除外。
变量命名尽量使用简短的名字,简写或者单词间采用了_隔开,比如代码中的sys_cfg_data。
函数最好短小精悍,一个函数最好只做一件事情,而且函数中的变量一般不超过10个,大小一般都小于80行。
一个模块的注释一般注明了作者、版权、注释说明代码的功能,而不是说明其实现原理,这也和Linux的文化有关。
以上是GNU编码风格和Linux内核编码风格,两种风格体现着两种不同的文化精神,有些地方相似,有些地方迥然不同,但是目的只有一个:形成一个清晰、美观、可维护、方便扩展的代码。读者可以根据个人情况选择其中一种编码规范来编写自己的程序。

时间: 2024-10-26 05:25:27

《Linux 高级程序设计(第三版)》——1.4 Linux下编码风格的相关文章

Linux高级程序设计(第三版)入货,清明节假日有得消遣罗~~

当当前天订的,今天送到的. 快递哥哥送一件货一块五呀,大家都不容易~~ 清明节老婆回老家看望亲人, 俺就好好学一学吧.

javascript高级程序设计(第三版)学习笔记(一) 正则表达式整理

1.创建正则表达式 第一种方式:注意这里的正则表达式不能使用单引号或者双引号,如下 var pattern1 = /[abc]/i; // 匹配第一个"a"或"b"或"c",不区分大小写 第二种方式:使用RegExp构造函数创建,该构造函数传入两个参数,都是字符串,所以需要特别注意"\"符号的转换,所有元字符(下面有讲元字符)需要双重转义,如下 复制代码 代码如下: var patt1 = new RegExp("[

JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))_javascript技巧

第一遍囫囵吞枣,不求甚解,感觉恍然大悟,结果晚上睡觉一想发现很多问题,什么都不明白,再看第二遍,发现原来是这样.过了几天一用,发现手写起来原来还是在凭记忆,于是下一遍,下一遍... 单凭记忆去弄清楚东西很不靠谱,时间一长脑袋空白.特别是技术上的很多思想和原理,只看不练,即便当时想得特别清楚,过久了也会忘.再者就是网上一些东西,只能说是提供了一种便捷的查看途径,事后还是自己总结为好,毕竟大多都是个人总结,一些概念很难讲的很清楚,而且两个人谈同一件事情,一般说的步骤和章节都是不同的,这样很容易形成交

《Linux 高级程序设计(第三版)》——2.2 GCC/GDB编译调试工具基础

2.2 GCC/GDB编译调试工具基础 Linux 高级程序设计(第三版) GCC/G++是GNU最优秀的自由软件之一,它主要提供C/C++程序的编译工作.Linux下的C.C++程序开发过程中,一般都采用GCC/G++/GDB工具.将C语言程序编译成一个可执行文件一般都需经过以下4个步骤. (1)预处理(Preprocessing):对源代码文件中的文件包含.宏定义.预编译语句进行分析和替换. (2)编译(Compilation):根据编译器的语法规则,将高级语言转换为以.s为后缀的汇编语言文

《Linux 高级程序设计(第三版)》——第2章 Linux下C语言开发工具 2.1 常用编辑工具

第2章 Linux下C语言开发工具 Linux 高级程序设计(第三版) Linux操作系统绝大多数的内核代码都是由C语言编写,因此,在Linux下的应用程序,特别是需要与内核进行交互的程序一般都是由C语言编写的,C++程序并不多见,例如驱动开发几乎都是由C语言编写的.因此,本书所有内容都立足于Linux下的C程序开发.本章主要介绍Linux下进行C语言程序开发所必备的工具. 本章第1节主要介绍Linux环境下常用的开发工具,包括常用的编辑器.这些编辑器类似于Windows平台下的记事本和Word

《Linux 高级程序设计(第三版)》——第1章  Linux下C语言开发环境 1.1 Linux操作系统简介

第1章 Linux下C语言开发环境 Linux应用程序开发平台有别于Windows应用程序开发平台,因此在介绍具体编程内容之前,本书第1.2章主要介绍Linux操作系统下C语言程序的开发环境和开发工具. 本章主要介绍Linux下C语言开发环境,包括一些基本概念和基本编程环境.本章第1节主要对Linux操作系统及其相关术语进行了简要介绍. 本章第2节主要介绍Linux操作系统下编程基本概念以及如何获得Linux下的帮助文件,包括Linux操作系统下C语言库文件标准以及系统调用的基本概念. 本章第3

《Linux 高级程序设计(第三版)》——1.3 部分常用工具简介

1.3 部分常用工具简介 Linux 高级程序设计(第三版)1.3.1 tar打包器 如果要发布包含大量程序和文档的程序,则需对其进行打包压缩.在Shell命令行下,可以使用的文件压缩工具有:gzip.bzip2和zip.相应的压缩和解压工具如表1-5所示. tar类型的文件是几个文件和(或)目录在一个文件中的集合,tar命令用来创建备份和归档.tar使用的选项有以下几项. -c:创建一个新归档. -x:从归档中抽取文件.即解压缩. -j:压缩/解压bz2格式tar文件. -z:压缩/解压gz格

《Linux 高级程序设计(第三版)》——导读

**前言**Linux应用开发是目前最为广泛的软件开发内容之一,同时也是从事Linux内核及驱动开发的基础.<Linux高级程序设计>一书经过两次出版,收到了大量的读者来信,对本书提出了各种意见和建议,同时,随着技术的更新,新技术.新应用不断涌现,综合各方面的考虑,笔者做了大量的修订工作,推出了第三版.(1)内容丰富.本书是作者多年计算机教学及工程经验总结,整合了Linux应用编程的绝大多数知识点,几乎涵盖了Linux操作系统下C应用编程的所有内容,包括工具使用及环境设置.文件及文件管理.进程

《Linux 高级程序设计(第三版)》——1.2 Linux开发初步

1.2 Linux开发初步 Linux 高级程序设计(第三版)1.2.1 Linux下C程序标准在Linux操作系统下进行C程序开发的标准主要有两个:ANSI C标准和POSIX标准. ANSI C标准是ANSI(美国国家标准局)于1989年制定的C语言标准,后来被ISO(国际标准化组织)接受为标准,因此也称为ISO C. POSIX标准是最初由IEEE开发的标准族,部分已经被ISO接受为国际标准. 1.ANSI CANSI C的目标是为各种操作系统上的C程序提供可移植性保证(例如Linux与W