IJG JPEG 函数库:代码规则
IJG JPEG 函数库:代码规则
版权 (C) 1991-1996, Thomas G. Lane.
本文是Independent JPEG Group软件中的一部分。
针对于如何分发与使用,请参照随本库一起发放的README 文件。
由于很多程序员将会为完善代码与bug修复中而共同努力,因此,统一编码风格将是很重要的一件事。使用相似的编码风格的目的不在于风格的细枝末节,而在统一的重要性。
一般,我们遵从推荐标准"Recommended C Style and Coding Standards"(C代码标准和编码风格推荐标准)的6.1版(Cannon等人。由Spencer, Keppel和Brader修订)。该文档可在IJG FTP目录中找到(参见jpeg/doc/cstyle.ms.tbl.Z,或者专为没有nroff/tbl r的使用者提供的cstyle.txt.Z)。
注释块应以下列方式布局:
/*
* Block comments in this style.
*/
我们使用K&R风格来对语句进行缩排,例如,
if (test) {
then-part;
} else {
else-part;
}
每一级缩排使用两个空格。(这种缩排习俗由GNU Emacs或其他文本编辑器自动完成。)
多个单词组成的名称应该以小写加下划线方式,例如,multi_word_name (不是multiWordName)。预处理器符号和枚举常量相似,但应使用大写形式(MULTI_WORD_NAME)。在前15个字符之内,名称应该保持唯一。(对一些老系统而言,全局变量名应在6位以内保持唯一。我们在不引起混乱的情况下,通过使用宏来代替较短的名称的方法来解决这个问题。)
我们可在任何地方使用函数原形;我们依赖于自动代码转换来弥补缺少原型的C编译器。转换是通过简单轻便的工具'ansi2knr.c'(蒙Ghostscript的好意)来完成的。ansi2knr并不是很智能化,因此要求在函数声明时要注意格式问题:函数名MUST BEGIN IN COLUMN 1。因此所有的函数都应该这样写:
LOCAL(int *)
function_name (int a, char *b)
{
code...
}
注:每个函数定义必须以GLOBAL(type), LOCAL(type),或 METHODDEF(type)开头。这些宏适当地扩充了"static type" 或仅仅是"type"。它们为函数的用法提供了一种可读性较好的标识且可为特殊的需求备用。(例如,特殊的链接词可被插入以便Windows DLLs使用。)
ansi2knr不能转换方法声明(结构体的中的函数声明)。我们用JMETHOD来解决,JMETHOD的定义如下:
#ifdef HAVE_PROTOTYPES
#define JMETHOD(type,methodname,arglist) type (*methodname) arglist
#else
#define JMETHOD(type,methodname,arglist) type (*methodname) ()
#endif
可被这样使用:
struct function_pointers {
JMETHOD(void, init_entropy_encoder, (int somearg, jparms *jp));
JMETHOD(void, term_entropy_encoder, (void));
};
注:应用圆括号将参数列表括起来。
相似的解决方案用于提交和外部函数声明(参见EXTERN and JPP 宏)。
如果代码将在非ANSI编译器上运行,我们将不能依赖于原型声明将正确的类型填入真实的参数中。因此,无论何时,当实际的参数类型和声明的不一致时,对真实的参数使用显示的强制类型转换(cast)。对隐式的"int"转化要谨慎。
好像存在一些非ANSI编译器,其中的sizeof操作符被定义为返回一个int,然而size_t却被定义为long。勿用置疑,这是伤脑筋的。我们使用 SIZEOF()宏来取代sizeof(),以便返回值保证是size_t类型。
JPEG库的目的是为了用在较大的程序中。此外,我们还想让其更为灵活以便可以在并发的多种图像处理的应用中。下面的规则支持这些需求:
1. 避免直接使用文件I/O,"malloc",错误报告输出等;通过使用一般的函数来避开这些。
2. 减少全局变量污染。无论何处,函数应尽可能声明为static的。(注:我们基于方法的调用习惯有助于该问题的解决:在许多模块中,一般只有初始化函数是永远需要被直接调用的,因此初始化函数需为外部可见的。)所有的全局函数名应以"jpeg_"开头,并在NEED_SHORT_EXTERNAL_NAMES被设置的情况下,应该具有一个用宏来代替的简短名称(头6个字符唯一)。
3. 不要使用全局变量;任何必须在另一个模块中使用的应该放在通用的数据结构中。
4. 除了只读常量表之外,不要使用静态(static)变量。对某个模块私有的变量可以将其置于私有结构体当中(参见系统架构文档,structure.doc)。
5. 对那些是库的组成部分的源文件名应该以‘j’为首字母;而非库中组成部分的源文件,例如,cjpeg.c和djpeg.c,就不需要以‘j’打头了。保持文件名为8字符(包括".c"或 ".h", 等),以保证与MS-DOS的兼容。保持压缩与解压缩代码放入分立的源文件中---一些应用可能只需发它们中的一个。
浙公网安备 33010602011771号