培训课程5UNIX下c语言编程.docx

上传人:b****5 文档编号:8794076 上传时间:2023-05-15 格式:DOCX 页数:30 大小:28.19KB
下载 相关 举报
培训课程5UNIX下c语言编程.docx_第1页
第1页 / 共30页
培训课程5UNIX下c语言编程.docx_第2页
第2页 / 共30页
培训课程5UNIX下c语言编程.docx_第3页
第3页 / 共30页
培训课程5UNIX下c语言编程.docx_第4页
第4页 / 共30页
培训课程5UNIX下c语言编程.docx_第5页
第5页 / 共30页
培训课程5UNIX下c语言编程.docx_第6页
第6页 / 共30页
培训课程5UNIX下c语言编程.docx_第7页
第7页 / 共30页
培训课程5UNIX下c语言编程.docx_第8页
第8页 / 共30页
培训课程5UNIX下c语言编程.docx_第9页
第9页 / 共30页
培训课程5UNIX下c语言编程.docx_第10页
第10页 / 共30页
培训课程5UNIX下c语言编程.docx_第11页
第11页 / 共30页
培训课程5UNIX下c语言编程.docx_第12页
第12页 / 共30页
培训课程5UNIX下c语言编程.docx_第13页
第13页 / 共30页
培训课程5UNIX下c语言编程.docx_第14页
第14页 / 共30页
培训课程5UNIX下c语言编程.docx_第15页
第15页 / 共30页
培训课程5UNIX下c语言编程.docx_第16页
第16页 / 共30页
培训课程5UNIX下c语言编程.docx_第17页
第17页 / 共30页
培训课程5UNIX下c语言编程.docx_第18页
第18页 / 共30页
培训课程5UNIX下c语言编程.docx_第19页
第19页 / 共30页
培训课程5UNIX下c语言编程.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

培训课程5UNIX下c语言编程.docx

《培训课程5UNIX下c语言编程.docx》由会员分享,可在线阅读,更多相关《培训课程5UNIX下c语言编程.docx(30页珍藏版)》请在冰点文库上搜索。

培训课程5UNIX下c语言编程.docx

培训课程5UNIX下c语言编程

 

UNIX程序设计规范

文档编号:

               

撰  写           撰写日期:

审  核:

         审核日期:

年月日

开发部

目录

第一章源文件组成结构5

§1程序注释5

§2头文件包含6

§3宏定义7

§4类型定义8

§5外部全局变量声明8

§6全局变量定义9

§7局部函数声明10

§8函数定义部分11

1.函数注释11

2.函数头12

3.局部变量定义12

4.函数正文12

§9注释17

第二章命名规范17

§1宏命名规范17

§2结构类型命名规范18

1.通讯结构18

2.数据库结构18

3.自定义结构18

§3变量命名规范19

1.数据字典项19

2.自定义变量19

第三章书写格式规范20

§1基本原则20

§2结构类型定义21

§3数组变量赋初值21

§4变量定义22

§5if语句22

§6for语句24

§7while语句24

§8do…while语句24

§9switch语句25

§10表达式25

第四章数据库操作接口26

§1基本原则26

§2查询27

1.单值查询27

2.多值查询28

§3修改32

1.预定义32

2.执行32

§4删除33

1.预定义33

2.执行33

§5插入34

1.插入单条记录34

2.插入多条记录35

§6编程规范37

1.预定义和游标定义的位置37

2.命名规范39

第一章源文件组成结构

典型的源程序依次包含以下部分:

●程序注释(必须);

●头文件包含;

●宏定义;

●类型定义;

●全局变量定义;

●局部函数声明;

●函数定义(必须)。

除了注明为必须的部分,其余部分视不同程序可选,但一旦出现,则必须严格按以上次序。

各部分之间应该加上必要的空行。

注释视需要穿插在整个文件中。

源程序行数应该控制在1000行以内,超过1000行的可以进行拆分。

源程序书写上严格按照本文第三章要求的格式。

下面按照模块的组成顺序依次说明。

§1程序注释

/*文件名:

ccpcjzmain.ec

*作者:

SB

*功能概述:

信用卡记帐主控

*创建时间:

1999/09/09

*修改记录:

*XXX1999/11/11加入利息税

*YYY2000/06/06统一龙卡出口

*/

……

§2头文件包含

包含头文件次序为:

系统头文件、应用系统公用头文件、应用头文件、EC头文件。

其中系统头文件用尖括号包含,其他头文件用双引号包含,EC头文件用EXECSQLINCLUDE包含,而且包含语句用分号结尾。

例如:

……

#include

#include

#include“secure.h”

#include“sys_dp.h”

EXECSQLINCLUDE“dbstruct.h”;

……

应用系统公用头文件和EC头文件(定义数据库结构)在开发开始之前由技术组随函数库一起统一发布,应用头文件统一由各业务组组长编辑产生,程序员一般不用自行编辑头文件。

§3宏定义

通用的宏应该在公用头文件中定义,这里只应该定义本文件中使用的宏。

尽量不要在程序中直接书写立即数(如:

5,’\n’,3.1415927等),而应该将其定义为宏。

注意:

如果宏要在EC语句中使用时,定义时用EXECSQLDEFINE,而且以分号结尾。

在定义有参数的宏以及常数宏是负数时,注意加上必要的括号,以免预编译进行宏替换时改变运算次序。

例如:

……

#defineADD(a,b)((a)+(b))

#defineETPCALL(-1)

……

如果宏名可能与头文件中定义的重复,则应该加上条件编译。

例如:

……

#ifndefBYTE

#defineBYTEunsignedchar

#endif/*BYTE*/

……

把几个语句定义为一个宏的做法虽然可以简化书写过程,但降低了程序的可读性,不建议使用。

§4类型定义

通用的类型应该在公用头文件中定义,这里只应该定义本文件中使用的类型。

结构都必须定义相应的类型。

在程序中,除了定义结构类型的地方,其他地方一概不允许出现‘struct’字样。

例如:

……

typedefstruct

{

inta,b;

charc;

}C_Noname;

……

C_Nonamea;

……

bzero(&a,sizeof(C_Noname));

……

§5外部全局变量声明

一般外部全局变量应该在头文件(由提供该全局变量的程序同时提供)中声明,要使用该外部变量时包含该头文件即可;

§6全局变量定义

全局变量在程序的全部执行过程中都占用内存,而且降低了函数的通用性和程序的清晰性,因此要限制使用全局变量。

如果全局变量仅仅在本文件中使用,定义时加上static修饰符,限制其作用域。

如果别的文件中也要使用该全局变量,则应该提供一个头文件,包含本文件提供给外部的所有函数和全局变量声明。

在头文件中声明全局变量时应该注意和定义时的方式保持一致。

例如:

文件file1.c

……

chara[80];

intb;

……

头文件file1.h

externchara[80];/*此处不能写成externchar*a*/

externintb;

……

变量值固定时前面加const修饰符,这样可以防止意外的修改。

此外,如果文件将被编译成动态链接库,这样做会减小数据段大小,从而减少运行时的开销——动态链接库仅仅共享正文段,数据段会复制到每个调用该库的进程中。

变量命名规范详见第二章

§7局部函数声明

外部函数声明应该写在由该外部函数提供者同时提供的头文件中,这里应该只声明本文件中定义的且仅由本文件使用的函数。

函数声明时,虽然只声明返回类型即可,但要求同时声明参数个数及类型,这样可以在函数调用语句时利用系统的自动类型转换功能。

例如:

#include

voidShow();

main()

{

Show(5.2);

}

voidShow(intn)

{

printf(“%d\n”,n);

}

这个程序在SCOUNIX上的输出结果是-858993459,这显然不是我们期望得到的结果。

造成这种结果的原因是函数声明时没有声明参数个数及类型,在函数调用语句时,系统不知道参数类型,无法进行类型转换,直接将8个字节的double型常量5.2传给了函数Show。

而函数Show将参数区的头4个字节当成形参n(因为参数声明为整型,在SCOUNIX上整型占4个字节),从而导致错误的结果。

如果将函数声明改为voidShow(int)或voidShow(intn),则可以导致在函数调用时系统进行自动类型转换,从而得到期望的结果。

局部函数声明前加上static修饰符以限制函数作用域。

要求声明所有局部函数,即使是那些函数定义在函数调用语句之前的局部函数。

系统在编译函数调用语句时,如果碰到先前既没有定义也没有声明的函数,则默认它返回整型。

这也是许多系统函数使用时可以不包含相应头文件的原因——因为许多系统函数都返回整型。

此时虽然编译时可以通过,但运行结果可能会有问题。

所以要求无论使用什么函数,一定要包含相应头文件,而且头文件中的函数声明也要按照上述要求声明参数个数和类型。

§8函数定义部分

1.函数注释

/*功能描述:

根据工号,获取操作员的姓名

*入口参数:

pstOperNo操作员工号

*出口参数:

pstOperName操作员姓名

*返回值:

0=成功,-1=失败

*/

2.函数头

定义函数参数和返回类型。

必须和声明一致。

参数个数不能太多,最好不超过8个。

因为参数个数太多时,会增加系统在参数传递上的开销。

参数实在太多时,可以定义一个结构,将参数填入结构中,然后传递结构地址。

3.局部变量定义

在定义变量时,如果没有特定要求(如用来记录函数返回值时,必须定义为函数返回值的类型),最好避免使用int型,而应该直接使用long型或short型,因为int型在不同系统上长度可能不同,而long型、short型则在大多数系统上相同。

需要返回局部变量的地址时,该局部变量一定要定义为静态局部变量(在定义前加static修饰符),否则会在调用者处导致内存错误。

固定值的变量前面加const修饰符,以防止意外的修改。

变量命名规范详见第二章

4.函数正文

这里只列出一些规范或需要引起注意的地方。

●尽量采用简短语句,不使用复杂的数据结构和算法;

●函数规模不要太大,一般不要超过100行。

规模太大的函数可以拆分成几个小一点的函数;

●对于很长的复合语句(例如在vi中一屏显示不下),在其结束’}’处加上注释表明这是哪个复合语句的结束,以便于阅读。

例如:

……

if(1==flag){

for(i=0;i

/*longlongprocess*/

……

}/*endoffor*/

}/*endofif*/

●不要把许多彼此间联系不大,很少可能同时使用的函数放在同一个文件中(尤其是在编库函数时)。

这是因为编译器在链接时,是以文件为单位的,即为了使用某个文件中的一个函数,编译器会将该文件中定义的所有函数都链接到执行码中,这会造成资源浪费;

●尽量不使用goto语句,但当使用goto可以大大提高效率,并且不严重影响程序可读性时也可以使用。

使用时一定要加上注释。

另外,这里说的goto是指函数内部的跳转,严禁使用函数间的跳转(longjmp);

●如果条件表达式是判断一个变量和一个常量的等值关系时,最好将常量写在前面,这样在不小心将“==”写成“=”时,可以在编译时就被发现。

例如:

……

if(5==i)break;

……

如果误写为(5=i)则编译时就会报错(需要左值);

而当(i==5)误写为(i=5)时编译不会报错。

而且这种错误由于其隐蔽性,往往很难排查

●不要对浮点类型(float型或double型)进行等值关系运算,浮点类型很难精确相等,应该以一定精度作为比较条件。

例如:

……

#definePRECISION0.001

……

doubleamt1,amt2;

……

if(ABS(amt1-amt2)

……

●函数调用语句中严禁出现改变其他参数内容的表达式(如自加、自减等,因为不同系统对函数参数求值的顺序可能不同,导致实参值不同);

●自加自减运算必须写成独立语句,严禁出现在其他表达式中;

●switch语句中必须加上default及必要的处理;

●将错误日志和调试信息区别开。

记录在不同的日志文件中;

●为便于移植,在使用系统函数时,注意尽可能使用符合ANSI或POSIX标准的函数(函数遵循哪些标准在man中可以看到)。

比如nap函数在SCO上可以使用,在SEQUENT上就不能使用;

●为便于移植,最好使用ANSIEC,不要使用’$’形式的EC,EC关键字大写。

例如:

……

EXECSQLUPDATEcustomer

SETzipcode=:

zipcode

WHEREcustomer_num=:

cnum;

……

●InformixEC中,当从数据库中查询字符串到EC变量时,会按照EC变量定义时的长度进行截取或补齐,使用时一定要注意(尤其要注意当EC变量长度长于真实数据时,后面用来补齐的空格)。

例如:

……

EXECSQLBEGINDECLARESECTION;

longcnum;

charcname[21];

EXECSQLENDDECLARESECTION;

……

EXECSQLSELECTcustomer_name

INTO:

cname

FROMcustomer

WHEREcustomer_num=:

cnum;

/*不管customer表中的customer_name定义为多长

*也不管customer_num等于cnum的客户的实际姓名有多长

*如果上述EC语句执行成功,字符串cname长度肯定为20

*/

……

●如果在SELECT语句中包含sum函数,一定要使用指示变量;

●在调用可能出错的函数(或EC语句)时,必须判断返回值(或sqlca.sqlcode)进行错误处理。

出错时禁止使用exit函数,应该把函数执行状态返回给调用者,由其决定进一步处理;

●功能相反、一般配对使用的函数或语句(如fopen/fclose、open/close、malloc/free、database/closedatabase、opencursor/closecursor等),在使用时要注意尽量放在同一个模块(同一个函数或至少同一个文件中),即“谁开始,谁结束”。

对于函数返回动态分配(malloc)的地址,由调用者使用后free的用法,如果不是一定要这样做,可以换成在函数中定义静态局部变量,然后返回其地址,这样调用者就不必关心空间释放问题。

§9注释

为了提高程序的可读性和可维护性,除了程序开始处的程序注释和函数开始处的函数注释以外,以下这些地方必须加上注释:

●变量定义时必须加上变量的中文说明;

●流程比较复杂的地方,必须加上流程说明;

●采用了比较复杂的算法的地方,必须加上算法说明;

●针对特定情况进行处理的地方,必须加上说明;

●switch语句中,每个case最后都必须是break语句。

在不写break的地方应该加入注释说明其意图;

●在使用无限循环时,应该加入注释说明其退出条件;

●在对已经定版的程序进行修改时,要在程序开头的程序说明中加入修改说明;

注释以‘/*’开始,以‘*/’结束,不能嵌套。

第二章命名规范

§1宏命名规范

宏一律采用大写字母带下划线。

例:

#defineMAX_NUM20

由于FML域以宏的方式提供给应用程序,所以FML域全部大写。

数据库表中标志字段(指用来表示某种状态或某种属性的字段)的取值采用宏定义方式,不要在程序中书写立即数。

宏名字为“字段名_属性值”(如果不同的表中有同名字段但含义不同的,协商后统一调整)。

例如:

操作员状态opr_state有以下几种状态:

NORMAL——正常

SIGNOFF——签退

则应该在头文件中定义如下宏:

EXECSQLDEFINEOPR_STATE_NORMAL‘0’;

EXECSQLDEFINEOPR_STATE_SIGNOFF‘1’;

§2结构类型命名规范

1.数据库结构

数据库表对应的EC结构名为‘DB_+小写表名’。

如:

override表对应的EC结构为DB_override。

2.自定义结构

自定义结构名为‘C_+名称’,名称各部分首字母大写,其余字母小写。

如:

typedefstruct{

intlen;

charcontent[80];

}C_VarRow;

§3变量命名规范

1.数据字典项

数据字典中定义的变量就按数据字典中的写法,但用作FML域名时全部大写。

如:

charunit_code[10];

FmlAdd(f,UNIT_CODE,unit_code);

2.自定义变量

自定义变量名采用‘类型缩写+名称’方式,名称各部分首字母大写,其余字母小写。

基本类型缩写见下表

类型名

缩写

Char

ch

Short

sh

Int

i

Long

l

Float

f

Double

d

结构类型缩写统一为c;指针和数组类型缩写为‘p+基本类型缩写’,但有两个特例:

字符数组(字符串)为str,类属指针(void*)为pv。

例如:

charchDisplayMode;/*显示方式*/

intiRecordCount;/*记录计数*/

doubledMoney;/*金额*/

charstrFileName[21];/*文件名*/

C_VarRowcVarRow;/*变长行*/

全局变量命名除了遵循上述规范之外,还要在前面加上g表示其作用域是全局的。

第三章书写格式规范

严格要求书写格式是为了使程序整齐美观、易于阅读、风格统一,程序员对规范书写的必要性要有明确认识。

在下列规范中,请注意{}的位置。

§1基本原则

●程序各部分之间、函数之间、函数内部相对独立的操作之间要加入空行以示分隔;

●原则上每行只能有一条语句;

●采用缩排法表示程序的层次关系。

所有函数定义之外的部分(包括头文件包含、宏定义、全局变量定义、局部函数声明等)全部齐头写,函数内部所有语句缩进一个制表位,复合语句的子句比该复合语句缩进一个制表位;

●使用制表符(TAB)对齐,不要使用空格。

每个制表位4个空格(在系统配置文件中指定了);

●一行写不下时,不要强行往后写,应该在下一行续写,续写的各行多缩进一个制表位。

断点不能位于保留字和标识符内部;断点在字符串内部时要在行末加续行符‘\’,而且下一行必须齐头写。

§2结构类型定义

结构成员的定义缩进一个制表位。

例如:

typedefstruct{

intlen;

charcontent[80];

}C_VarRow;

§3数组变量赋初值

初值列表中每个‘,’后面要有空格(对于字符串数组要有回车)。

例如:

intiPower[8]={1,2,4,8,16,32,64,128};

char*pstrErrMsg[]={

“unknownerror”,

“operationnotpermitted”,

“nosuchfileordirectory”

};

§4变量定义

每行定义一个变量,变量类型和变量名之间用制表符分隔,行末加入变量注释。

如:

intmain()

{

charunit_code[80];/*机构码*/

charstrFileName[80];/*文件名*/

}

当复合语句不长时,可以在复合语句开始处定义临时变量。

这样做的好处在于编程时不用一直前翻到函数开始处去定义这个临时变量,同时也方便了阅读。

另外,临时变量仅在该复合语句内部有效,即使复合语句外部有同名变量也没有影响(除非复合语句内部要使用该外部同名变量)。

例如:

if(a[i]

intt;

t=a[i];a[i]=a[j];a[j]=t;

}

§5if语句

●格式1

if(expression){

statement

}

●格式2

if(expression){

statement1

}else{

statement2

}

●格式3

if(expression1){

statement1

}elseif(expression2){

statement2

}elseif(expression3){

}else{

statementn

}

当子句只有一条语句时,{}可以省略,但子句仍必须另起一行写。

下面各种语句同样有这一规定,下不赘述。

如:

if(i>0)

j++;

但是,在条件语句嵌套时,不要省略{},以免else和if不匹配。

如:

if(i>0)

if(1==i)

printf(“i=1\n”);

else

printf(“i<=0\n”);

在书写上else和第一个if匹配(假定这也是作者的本意),但实际编译时,else将和第二个if匹配。

为达到作者的意图,应该写为:

if(i>0){

if(1==i)

printf(“i=1\n”);

}else

printf(“i<=0\n”);

§6for语句

for(expression1;expression2;expression3){

statement

}

§7while语句

while(expression){

statement

}

§8do…while语句

do{

statement

}while(expression);

§9switch语句

switch(expression){

caseconstant1:

statements1

break;

caseconstant2:

statements2

break;

default:

statementsn

break;

}

expression只能是整型表达式或字符型表达式。

statements可以是多条语句。

§10表达式

表达式要清晰明了,在操作数和运算符(包括赋值运算符、数学运算符、关系运算符、逻辑运算符、位运算符等)之间都要有空格分开,在运算次序不明了的地方加上括号。

函数表达式的参数列表中,每个‘,’后面要有空格。

如:

dArea=PI*dRadius*dRadius;

dPerimeter=(dLength+dWidth)*2;

(i>=0)&&(i

printf(“ascii%dis[%c]\n”,i,i);

第四章数据库操作接口

§1基本原则

●数据库操作要求先进行预定义,定义一次可以反复使用,游标也要求预先定义(仅定义一次)。

这在目前的应用模式下可以大大提高效率;

●每一个EC操作后都要进行错误检查。

除非特别声明,一般sqlca.sqlcode为0表示成功;为100表示在查询语句中没有记录;其他表示错误。

出错时要求用DB_ERR(提示字符串)记录错误日志。

在下面有关EC语句的语法中,大写字母为保留字。

§2查询

1.单值查询

1.1.预定义

EXECSQLPREPAREstatement_nameFROMstring;

其中:

●statement_name:

用于标识SQL语句的标识符;

●string:

字符串。

其内容是一个返回单值的SELECT语句。

可以携带输入参数,输入参数在字符串中用‘?

’表示。

注意不要在字符串中指定宿主语言变量,这就意味着这里不能指定INTO子句。

例如:

EXECSQLPREPAREsel_idFROM“SELECTcompanyFROMcustomerWHEREcustomer_num=101”;

带输入参数时:

EXECSQLPREPAREsel_id_paraFROM“SELECTcompanyFROMcustomerWHEREcustomer_num=?

”;

1.2.执行

EXECS

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2