C语言编程规范
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
定义函数体的左右大括号要各自独占一行。
注释与前面的执行语句之间空一行。
例子详见 rpt255.cp、sp6787.c
4、 Tab 键缩进
利用缩进来显示程序的逻辑结构,缩进量一致并以 Tab 键为单位,定义 Tab 键为 8 个空格. 在 UE 中修改 Tab 键宽度:高级—配置—编辑—将制表符宽度和缩进空格都 设为 8,这样代码用 UE 打开和用 vi 打开的视觉效果就一致了。 例子详见 rpt255.cp、sp6787.c
1、acct
帐务核心处理部分
2、agent
中间业务公函
3、ass
考核公函
4、base
基本函数(日期,字符,金额等处理)
5、beps
小额
6、card
卡
7、cif
客户
8、com
凭证和现金
9、comm
通讯
10、de
存取款
11、eod
百度文库
日终
12、ln
贷款
13、mbfe
大额
14、od
透支
15、pubdb
数据库操作
g_pub_tx.tx_date 结构体变量:
struct ln_mst_hst_c sLn_mst_hst; 或 struct ln_mst_hst_c s_ln_mst_hst;
6、 程序结构清晰
程序结构清析,简单易懂,单个函数的程序行数不得超过 100 行。 一行只写一条语句,不允许把多个短语句写在一行中。 循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分;划分 的原则:整齐、美观、符合其他编码规范。 太长的程序分成若干个函数实现。 例子详见 rpt255.cp、sp6787.c
学习参考别人的代码,不要有用的没用的完全照搬。
使用括号以避免二义性。 如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默 认的优先级。
3、 尽量使用标准库函数和公共函数。
公共函数都是将常用的复杂功能封装测试好的函数,使用公共函数可以提高
编程效率与质量,减少出错率。
公共函数所在目录:src/pubf
*
* 修改记录:
* 日 期: 2003 年 4 月 25 日
* 修 改 人: jane
* 修改内容: 此交易只允许上级机构查询下级机构,不能垮管理查询,
*
网点间不能互查,同一网点柜员间可以互查;
*************************************************/
函数头说明范例:
:无校验的账号
*
int mode : 帐号介质(1 客户帐号 2 内部帐号 3 卡帐号 4 客户号)
*
chkb_len : 校验位的长度
*
* 输出: chkb_acno : 带校验位的帐号
*
* 返 回 值: 0 成功,1 失败
*
* 修改历史:
*
********************************************************************/
* 函 数 名: pub_base_GetDate
* 函数功能: 取得系统日期
* 作 者:
* 完成时间: 2003 年 12 月 16 日
*
* 参 数:
* 输 入:无
*
* 输 出:year: 年
*
month: 月
*
day: 日
*
* 返回值:无
*
* 修改历史:
*
********************************************************************/
/**********************************************************************
* 函数名: pub_base_CrtAcChkb
* 函数功能: 生成账号校验位
* 作者/时间: xxx 2003 年 12 月 16 日
*
* 参数:
* 输入: acno
要编号
匈牙利命名法是一名匈牙利程序员发明的,而且他在微软工作了多年。此命 名法就是通过微软的各种产品和文档传出来的。多数有经验的程序员,不管他们 用的是哪门儿语言,都或多或少在使用它
这种命名法的基本原则是: 变量名=属性+类型+对象描述 即一个变量名是由三部分信息组成,这样,程序员很容易理解变量的类型、 用途,而且便于记忆。
if (ret >= 0)
tmpje = g_dd_mst.ctl_amt + g_dd_mst.hold_amt +
5、 变量命名
一些共性规则: – 直观并且可以拼读,可望文知意,不必“解码”。 – 名字的长度:min-length && max-information 原则 – 与操作系统和开发工具的风格保持一致 – 程序中不要出现仅靠大小写区分的相似的标识符 – 程序中不要出现标识符完全相同的局部变量和全局变量 – 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等 – 尽量避免名字中出现数字编号,如 Value1,Value2 等,除非逻辑上的确需
memset(&sGl_sub, 0x00, sizeof(struct gl_sub_c)); memset(&s_com_item,0x00,sizeof(struct com_item_c)); ret = Com_item_Sel( g_pub_tx.reply, &s_com_item, "acc_hrt='%s'", s_gl_sub.acc_hrt ); pub_base_strpack( s_com_item.acc_no );
函数功能: 比较两个 DOUBLE 型数据大小
输入参数: amt1: 第一个 DOUBLE 型数据
amt2: 第二个 DOUBLE 型数据
输 出:
无
返回值:
0 相等
1 第一个大于第二个
-1 第一个小于第二个
例如:
ret = pub_base_CompDblVal(g_dd_mst.hold_amt, g_dd_parm.min_bal);
6、 变量在可见范围内必须初始化
变量使用前一定要初始化,刚分配的内存空间,或者是被你用过的内存空间 里面的数据是不固定的。为了避免这些无用的数据给自己的程序带来影响,要在 可见范围内进行初始化,一般情况下是置 0。
①整型、浮点型等在定义时直接赋初值, int lst_days=0; double amt=0.00;
if( strlen(s_com_item.acc_no)==7 ) {
continue; }else{
ret=Gl_sub_Sel( g_pub_tx.reply , &sGl_sub , "br_no='%s' and cur_no='01' and acc_hrt like '%s%%' \
and (rdd_amt<>0 or rcd_amt<>0 or dr_bal<>0 or cr_bal<>0 or ldd_bal<>0 or lcd_bal<>0)" ,s_gl_sub.br_no, s_com_item.acc_no);
基本要求
1、 函数声明
一定要显示声明函数的返回值类型。 如果函数不需要返回值,要声明为 void 类型。 返回类型为 double 型的函数必须声明.
返回类型为指针的函数要求必须声明。 函数的声明要与函数定义一致(包括函数的类型及参数的类型、个数、顺序)
2、 代码清晰
打算干什么,要简单,直接了当,代码精简,避免垃圾程序。
void pub_base_GetDate(int *year, int *month, int *day) {
time_t t; struct tm *local_time;
t = time(0); local_time = localtime(&t);
*year = 1900 + local_time->tm_year; *month = local_time->tm_mon+1; *day = local_time->tm_mday;
②指针赋为 NULL FILE *fp; fp=NULL; 要时刻注意指针的指向。
③结构体、数组、字符串用 memset 初始化,以免出现乱码 memset(&s_com_sys_parm, 0x00, sizeof(struct com_sys_parm_c)); memset(whlst, 0x0, sizeof(whlst)); 字符数组的定义和初始化要考虑‘\0’。
!pub_base_CompDblVal(s_gl_sub.cr_bal,0.00) && !pub_base_CompDblVal(s_gl_sub.ldd_bal,0.00) && !pub_base_CompDblVal(s_gl_sub.lcd_bal,0.00) && !pub_base_CompDblVal(s_gl_sub.rdd_amt,0.00) && !pub_base_CompDblVal(s_gl_sub.rcd_amt,0.00) ) {
可读性要求
C 语言编程规范
1、 说明
每个源程序文件,都有文件头说明
每个函数,都有函数头说明
文件头说明范例:
/*************************************************
* 文 件 名: sp8302.c
* 功能描述: 柜员凭证查询
*
* 作 者: jane
* 完成日期: 2003 年 4 月 12 日
7、 比较
1.用“==”比较变量和常数是否相等时,把常数写在左边,以防止把“==” 写成“=”。
例如: if(1==i) {
…….. } 2.需要用浮点数比较的时候,不要通过等号“==”和不等号“!=”来进行比 较。用公共函数 pub_base_CompDblVal 比较。
函 数 名: pub_base_CompDblVal
做好事要留名,注意备份 修改程序必须注明的要素:谁何时因何种原因修改那部分的代码,并且注意 备份修改之前的程序
2、 注释
尽量使用/* 注释内容 */ 格式,不要使用//格式 保持注释与代码完全一致。 对单行代码的注释可以在代码的上方和代码的后面; 对多行代码的注释应该放在代码的上方;
例 1. int head_flag = 0 ;/***added bye liuyue 20061129 在处理 6*科目的时候因为有的支行该类科 目都为 0,导致了打印时候不打表头的情况***/ 例 2. /* 打印下级科目有金额的上级科目 added by martin 20061104*/ if( !pub_base_CompDblVal(s_gl_sub.dr_bal,0.00) &&
下边是一些推荐使用的规则例子,你可以挑选使用,也可以根据个人喜好作 些修改再用之。
⑴属性部分: 全局变量: g_ 常量 : c_
⑵类型部分: 指针: p 布尔型: b 浮点型: f 无符号: u ⑶描述部分: 初始化: Init 临时变量: Tmp 目的对象: Dst 源对象: Src
下边举例说明: 全局变量: g_ 开头 例如:g_pub_tx.reply
return ; }
3、 空行
空行和空白字符也是一种特殊注释
在两个函数定义之间必须使用空行分开。
在函数定义中,用空行将代码按逻辑片断划分。 例如两个并列的判断语句之间就可以用空行来区分;变量的定义、变量的初 始化以及真正的处理语句之间就可以用空行来区分。
类别不一致的宏定义之间、全局变量之间、函数声明之间需要添加空行。
16、pubdb_m
数据库特殊操作
17、rept、rpt
报表
18、sttl
资金
公共函数的命名规律:目录_功能
如:pub_base_ac_prdt()所在目录为 src/pubf/base
4、 头文件
为了减少执行程序的大小,不应包含不需要的头文件。
5、 变量定义
不要随意定义全局变量,尽量使用局部变量。 少用全局变量,如果是程序级全局变量,定义在主文件中,其他文件用 extern 显式声明。 文件级全局变量,一定要用 static 声明。 不要在程序中间声明变量。 例子详见 rpt255.cp、sp6787.c
if( ret==100 ) {
continue; } } }
主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。 常量定义(DEFINE)有相应说明。 处理过程的每个阶段都有相关注释说明。
在典型算法前都有注释。
例 3.
/**********************************************************************
注释与前面的执行语句之间空一行。
例子详见 rpt255.cp、sp6787.c
4、 Tab 键缩进
利用缩进来显示程序的逻辑结构,缩进量一致并以 Tab 键为单位,定义 Tab 键为 8 个空格. 在 UE 中修改 Tab 键宽度:高级—配置—编辑—将制表符宽度和缩进空格都 设为 8,这样代码用 UE 打开和用 vi 打开的视觉效果就一致了。 例子详见 rpt255.cp、sp6787.c
1、acct
帐务核心处理部分
2、agent
中间业务公函
3、ass
考核公函
4、base
基本函数(日期,字符,金额等处理)
5、beps
小额
6、card
卡
7、cif
客户
8、com
凭证和现金
9、comm
通讯
10、de
存取款
11、eod
百度文库
日终
12、ln
贷款
13、mbfe
大额
14、od
透支
15、pubdb
数据库操作
g_pub_tx.tx_date 结构体变量:
struct ln_mst_hst_c sLn_mst_hst; 或 struct ln_mst_hst_c s_ln_mst_hst;
6、 程序结构清晰
程序结构清析,简单易懂,单个函数的程序行数不得超过 100 行。 一行只写一条语句,不允许把多个短语句写在一行中。 循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分;划分 的原则:整齐、美观、符合其他编码规范。 太长的程序分成若干个函数实现。 例子详见 rpt255.cp、sp6787.c
学习参考别人的代码,不要有用的没用的完全照搬。
使用括号以避免二义性。 如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默 认的优先级。
3、 尽量使用标准库函数和公共函数。
公共函数都是将常用的复杂功能封装测试好的函数,使用公共函数可以提高
编程效率与质量,减少出错率。
公共函数所在目录:src/pubf
*
* 修改记录:
* 日 期: 2003 年 4 月 25 日
* 修 改 人: jane
* 修改内容: 此交易只允许上级机构查询下级机构,不能垮管理查询,
*
网点间不能互查,同一网点柜员间可以互查;
*************************************************/
函数头说明范例:
:无校验的账号
*
int mode : 帐号介质(1 客户帐号 2 内部帐号 3 卡帐号 4 客户号)
*
chkb_len : 校验位的长度
*
* 输出: chkb_acno : 带校验位的帐号
*
* 返 回 值: 0 成功,1 失败
*
* 修改历史:
*
********************************************************************/
* 函 数 名: pub_base_GetDate
* 函数功能: 取得系统日期
* 作 者:
* 完成时间: 2003 年 12 月 16 日
*
* 参 数:
* 输 入:无
*
* 输 出:year: 年
*
month: 月
*
day: 日
*
* 返回值:无
*
* 修改历史:
*
********************************************************************/
/**********************************************************************
* 函数名: pub_base_CrtAcChkb
* 函数功能: 生成账号校验位
* 作者/时间: xxx 2003 年 12 月 16 日
*
* 参数:
* 输入: acno
要编号
匈牙利命名法是一名匈牙利程序员发明的,而且他在微软工作了多年。此命 名法就是通过微软的各种产品和文档传出来的。多数有经验的程序员,不管他们 用的是哪门儿语言,都或多或少在使用它
这种命名法的基本原则是: 变量名=属性+类型+对象描述 即一个变量名是由三部分信息组成,这样,程序员很容易理解变量的类型、 用途,而且便于记忆。
if (ret >= 0)
tmpje = g_dd_mst.ctl_amt + g_dd_mst.hold_amt +
5、 变量命名
一些共性规则: – 直观并且可以拼读,可望文知意,不必“解码”。 – 名字的长度:min-length && max-information 原则 – 与操作系统和开发工具的风格保持一致 – 程序中不要出现仅靠大小写区分的相似的标识符 – 程序中不要出现标识符完全相同的局部变量和全局变量 – 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等 – 尽量避免名字中出现数字编号,如 Value1,Value2 等,除非逻辑上的确需
memset(&sGl_sub, 0x00, sizeof(struct gl_sub_c)); memset(&s_com_item,0x00,sizeof(struct com_item_c)); ret = Com_item_Sel( g_pub_tx.reply, &s_com_item, "acc_hrt='%s'", s_gl_sub.acc_hrt ); pub_base_strpack( s_com_item.acc_no );
函数功能: 比较两个 DOUBLE 型数据大小
输入参数: amt1: 第一个 DOUBLE 型数据
amt2: 第二个 DOUBLE 型数据
输 出:
无
返回值:
0 相等
1 第一个大于第二个
-1 第一个小于第二个
例如:
ret = pub_base_CompDblVal(g_dd_mst.hold_amt, g_dd_parm.min_bal);
6、 变量在可见范围内必须初始化
变量使用前一定要初始化,刚分配的内存空间,或者是被你用过的内存空间 里面的数据是不固定的。为了避免这些无用的数据给自己的程序带来影响,要在 可见范围内进行初始化,一般情况下是置 0。
①整型、浮点型等在定义时直接赋初值, int lst_days=0; double amt=0.00;
if( strlen(s_com_item.acc_no)==7 ) {
continue; }else{
ret=Gl_sub_Sel( g_pub_tx.reply , &sGl_sub , "br_no='%s' and cur_no='01' and acc_hrt like '%s%%' \
and (rdd_amt<>0 or rcd_amt<>0 or dr_bal<>0 or cr_bal<>0 or ldd_bal<>0 or lcd_bal<>0)" ,s_gl_sub.br_no, s_com_item.acc_no);
基本要求
1、 函数声明
一定要显示声明函数的返回值类型。 如果函数不需要返回值,要声明为 void 类型。 返回类型为 double 型的函数必须声明.
返回类型为指针的函数要求必须声明。 函数的声明要与函数定义一致(包括函数的类型及参数的类型、个数、顺序)
2、 代码清晰
打算干什么,要简单,直接了当,代码精简,避免垃圾程序。
void pub_base_GetDate(int *year, int *month, int *day) {
time_t t; struct tm *local_time;
t = time(0); local_time = localtime(&t);
*year = 1900 + local_time->tm_year; *month = local_time->tm_mon+1; *day = local_time->tm_mday;
②指针赋为 NULL FILE *fp; fp=NULL; 要时刻注意指针的指向。
③结构体、数组、字符串用 memset 初始化,以免出现乱码 memset(&s_com_sys_parm, 0x00, sizeof(struct com_sys_parm_c)); memset(whlst, 0x0, sizeof(whlst)); 字符数组的定义和初始化要考虑‘\0’。
!pub_base_CompDblVal(s_gl_sub.cr_bal,0.00) && !pub_base_CompDblVal(s_gl_sub.ldd_bal,0.00) && !pub_base_CompDblVal(s_gl_sub.lcd_bal,0.00) && !pub_base_CompDblVal(s_gl_sub.rdd_amt,0.00) && !pub_base_CompDblVal(s_gl_sub.rcd_amt,0.00) ) {
可读性要求
C 语言编程规范
1、 说明
每个源程序文件,都有文件头说明
每个函数,都有函数头说明
文件头说明范例:
/*************************************************
* 文 件 名: sp8302.c
* 功能描述: 柜员凭证查询
*
* 作 者: jane
* 完成日期: 2003 年 4 月 12 日
7、 比较
1.用“==”比较变量和常数是否相等时,把常数写在左边,以防止把“==” 写成“=”。
例如: if(1==i) {
…….. } 2.需要用浮点数比较的时候,不要通过等号“==”和不等号“!=”来进行比 较。用公共函数 pub_base_CompDblVal 比较。
函 数 名: pub_base_CompDblVal
做好事要留名,注意备份 修改程序必须注明的要素:谁何时因何种原因修改那部分的代码,并且注意 备份修改之前的程序
2、 注释
尽量使用/* 注释内容 */ 格式,不要使用//格式 保持注释与代码完全一致。 对单行代码的注释可以在代码的上方和代码的后面; 对多行代码的注释应该放在代码的上方;
例 1. int head_flag = 0 ;/***added bye liuyue 20061129 在处理 6*科目的时候因为有的支行该类科 目都为 0,导致了打印时候不打表头的情况***/ 例 2. /* 打印下级科目有金额的上级科目 added by martin 20061104*/ if( !pub_base_CompDblVal(s_gl_sub.dr_bal,0.00) &&
下边是一些推荐使用的规则例子,你可以挑选使用,也可以根据个人喜好作 些修改再用之。
⑴属性部分: 全局变量: g_ 常量 : c_
⑵类型部分: 指针: p 布尔型: b 浮点型: f 无符号: u ⑶描述部分: 初始化: Init 临时变量: Tmp 目的对象: Dst 源对象: Src
下边举例说明: 全局变量: g_ 开头 例如:g_pub_tx.reply
return ; }
3、 空行
空行和空白字符也是一种特殊注释
在两个函数定义之间必须使用空行分开。
在函数定义中,用空行将代码按逻辑片断划分。 例如两个并列的判断语句之间就可以用空行来区分;变量的定义、变量的初 始化以及真正的处理语句之间就可以用空行来区分。
类别不一致的宏定义之间、全局变量之间、函数声明之间需要添加空行。
16、pubdb_m
数据库特殊操作
17、rept、rpt
报表
18、sttl
资金
公共函数的命名规律:目录_功能
如:pub_base_ac_prdt()所在目录为 src/pubf/base
4、 头文件
为了减少执行程序的大小,不应包含不需要的头文件。
5、 变量定义
不要随意定义全局变量,尽量使用局部变量。 少用全局变量,如果是程序级全局变量,定义在主文件中,其他文件用 extern 显式声明。 文件级全局变量,一定要用 static 声明。 不要在程序中间声明变量。 例子详见 rpt255.cp、sp6787.c
if( ret==100 ) {
continue; } } }
主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。 常量定义(DEFINE)有相应说明。 处理过程的每个阶段都有相关注释说明。
在典型算法前都有注释。
例 3.
/**********************************************************************