GUN开放源代码方面的要求

来源:互联网 发布:微信商城 源码 编辑:程序博客网 时间:2024/06/05 19:07

在任何情况下都不要饮用有版权的代码

善意接收别人给您的程序添加的代码,但要检查其合法性,即是否也是GUN的

编写日志文件(Changelog),这将是您的代码更容易维护。

GUN对C程序风格的要求:

函数的开头的左花括号放到最左边,避免把任何其它的左花括号、左括号或者左方括号放到最左边。
对于函数定义来说,把函数名的起始字符放到最左边也同样重要。
这帮助任何寻找函数定义,并且可能有助于帮助某些工具识别它们。
static char *concat (s1, s2)        /* 名字开始放在第0列 */      char *s1, *s2;{                     /* 函数大括号也放在第0列 */      ...}
标准C: 

static char *concat (char *s1, char *s2){    ...}

•如果参数不能够被美观地放在一行中,按照下面的方式把它们分开:
intlots_of_args (int an_integer, long a_long, short a_short,              double a_double, float a_float)
•对于函数体,我们希望它按照如下方式排版:
    if (x < foo (y, z))        haha = bar[4] + 5;      else      {          while (z)            {              haha += foo (z, z);              z--;            }          return ++x + bar ();       }
•在左括号之前以及逗号之后添加空格将使程序更加容易阅读。尤其是在逗号之后添加空格。
当我们把一个表达式分成多行的时候,在操作符之前而不是之后分割
if (foo_this_is_long && bar > win (x, y, z)            && remaining_condition)
•尽力避免让两个不同优先级的操作符出现在相同的对齐方式中。
例如,不要象下面那样写: 
mode = (inmode[j] == VOIDmode                || GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])                ? outmode[j] : inmode[j]);
•应该附加额外的括号以使得文本缩进可以表示出这种嵌套:

例 mode = ((inmode[j] == VOIDmode                 || (GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])))                ? outmode[j] : inmode[j]);

•按照如下方式排版do-while语句:

do    {a = foo (a);    }   while (a > 0);

•每个程序都应该以一段简短地、说明其功能的注释开头。

`fmt - filter for simple filling of text'

请为每个函数书写注释以说明函数做了些什么,需要哪些种类的参数,参数可能值的含义以及用途。如果按照常见的方式使用C语言类型,就没有必要逐字重写C参数声明的含义。如果它使用了任何非标准的东西,或者是可能导致函数不能工作的任何可能的值(例如,不能保证正确处理一个包含了新行的字符串),请确认对它们进行了说明。如果存在重要的返回值,也需要对其进行解释。

•不要在跨越了行的声明中声明多个变量。在每一行中都以一个新的声明开头。
例如,不应该:

int    foo,        bar;

而应该:

 int foo, bar;
 int foo; int bar;

•当在一个if语句中嵌套了另一个if-else语句,总是用花括号把if-else括起来。因此,不要写:
例 if (foo)          if (bar)            win ();          else            lose ();
应该写成:

if (foo)          {            if (bar)              win ();            else              lose ();          }

•要在同一个声明中同时说明结构标识和变量或者结构标试和类型定义(typedef)。 单独地说明结构标试,而后用它定义变量或者定义类型。 
•尽力避免在if的条件中进行赋值。例如,不要写:
例  if ((foo = (char *) malloc (sizeof *foo)) == 0)          fatal ("virtual memory exhausted");
要写成:

例  foo = (char *) malloc (sizeof *foo);        if (foo == 0)          fatal ("virtual memory exhausted");

•请在名字中使用下划线以分隔单词,坚持使用小写;
把大写字母留给宏和枚举常量,以及根据统一的惯例使用的前缀。 
例如,应该使用类似ignore_space_change_flag的名字;不要使用类似iCantReadThis的名字。

•用于标明一个命令行选项是否被给出的变量应该在选项含义的说明之后,而不是选项字符之后,被命名。
一条注释即应该说明选项的精确含义,还应该说明选项的字母。
例如,
/* Ignore changes in horizontal whitespace (-b).  */        int ignore_space_change_flag;


Linux 内核编程风格
(1)Linux内核缩进风格是8个字符。
(2)Linux内核风格采用K&R标准,将开始的大括号放在一行的最后,而将结束的大括号放在一行的第一位。
(3)命名尽量简洁。不应该使用诸如ThisVariableIsATemporaryCounter之类的名字。应该命名为tmp,这样容易书写,也不难理解。但是命名全局变量,就应该用描述性命名方式,例如应该命名“count_active_users()”,而不是“cntusr()”。本地变量应该避免过长。

•GCC是一组编译工具的总称,主要包括如下工具:
• C 编译器:  cc、ccl、cclplus、gcc
•C++编译器: c++、g++
•源码预处理程序:cpp
•标准库文件

Linux系统中可执行文件有两种格式。第一种格式是a.out格式,

•把a.out格式调整为共享库是一种非常复杂的操作,由于这个原因,一种新的文件格式被引入Unix系统5的第四版本和Solaris系统中。它被称为可执行和连接的格式(ELF)。这种格式很容易实现共享库。

ELF格式已经被Linux系统作为标准的格式采用。gcc编译程序产生的所有的二进制文件都是ELF格式的文件(即使可执行文件的默认名仍然是a.out)。较旧的a.out格式的程序仍然可以运行在支持ELF格式的系统上。 
•-x:强制编译器用指定的语言编译器来编译某个源文件
gcc –x c++ test.c  表示强制用C++编译器来编译c程序
•-share: 编译时尽量使用动态库
•-o:指定生成的可执行文件名,如果没有该选项,如果生成可执行文件,默认文件名为a.out
•-C: 告诉预处理器不要丢弃注释.配合`-E‘选项使用.
-P:告诉预处理器不要产生`#line'命令.配合`-E'选项使用. 

目标生成选项
-shared: 生成动态库
gcc –shared libtest.so -i /home/zry/test.h test.c
生成静态库需要ar命令,后面讲解
-fPIC: 生成可用于动态库的位置独立代码。所有的内部寻址均通过全局偏移表完成。
-ansi:支持符合ANSI标准的C程序.
该选项就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof关键字以及诸如unix和vax这些表明当前系统类型的预定义宏。
__asm__, __extension__, __inline__和__typeof__仍然有效
使用`-ansi'选项的时候,预处理器会预定义一个__STRICT_ANSI__宏.有些头文件 关注此宏,以避免声明某些函数,或者避免定义某些宏,这些函数和宏不被ANSI标准调用;这样就不会干扰在其他地方使用这些名字的程序了
fno-asm:此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。
-fno-strict-prototype:只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,而不是没有参数.而gcc无论是否使用这个参数,都将对没有带参数的函数,认为没有显式说明的类型
-fthis-is-varialble:就是向传统c++看齐,可以使用this当一般变量使用
-fcond-mismatch:允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型
-funsigned-char:
-fno-signed-char:
-fsigned-char:
-fno-unsigned-char:
这四个参数是对char类型进行设置,将char类型设置unsigned char(前两个参数)或者 signed char(后两个参数)
-imacros file: 将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中
-Dmacro: 相当于C语言中的#define macro
-Dmacro=defn: 相当于C语言中的#define macro=defn
-Umacro: 相当于C语言中的#undef macro
-undef: 取消对任何非标准宏的定义
-M: 生成文件关联的信息。包含目标文件所依赖的所有源代码
-MM: 和M一样,但是它将忽略由#include<file>造成的依赖关系。
-MD: -M相同,但是输出将导入到.d的文件里面
-MMD: 和-MM相同,但是输出将导入到.d的文件里面
警告选项
fsyntax-only:检查程序中的语法错误,但是不产生输出信息.
-w:禁止所有警告信息.
-Wno-import: 禁止所有关于#import的警告信息.
-pedantic:打开完全遵从ANSI C标准所需的全部警告诊断;拒绝接受采用了被禁止的语法扩展的程序.
-Werror:将所有警告转换为错误
Werror选项要求GCC将所有警告当作错误进行处理。
-Wall: 显示所有警告信息
–调试分析选项
•-g:生成调试信息。GCC编译器将调试信息加入到目标文件中,GDB调试器就可以根据该调试信息来跟踪程序的执行状态了。
•-p:为prof命令建立剖析信息
•-pg:为prof命令建立剖析信息
•-gstabs:此选项以stabs格式声称调试信息,但是不包括gdb调试信息.
•-gstabs+:选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.
•-ggdb:此选项将尽可能的生成gdb的可以使用的调试信息.


原创粉丝点击