已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C代码编写规范目录C代码编写规范1概述5规则51.1 文件结构51.1.1 文件扩展名51.1.2 版权和版本的声明51.1.3 头文件和定义文件结构61.2 程序排版91.2.1 概述91.2.2 缩进、空行、空格与对齐91.2.3 长行拆分111.2.4 修饰符的位置121.2.5 注释121.2.6 可读性141.2.7 自定义类型151.2.8 预编译指令161.3 命名规则171.3.1 基本原则171.3.2 具体命名原则171.4 表达式和基本语句191.4.1 表达式191.4.2 基本语句191.4.3 常量规则201.4.4 变量规则211.4.5 结构221.5 函数规则241.5.1 参数规则241.5.2 返回值的规则241.5.3 函数内部规则251.5.4 函数使用方法251.5.5 函数建议271.5.6 断言281.6 代码编辑、编译与审查291.6.1 代码编辑291.6.2 代码编译291.6.3 代码审查301.7 代码测试与维护301.8 宏311.9 程序效率311.10 质量保证33附件351.11 附件一 运算符顺序351.12 附件二 英文常用缩写36第36页 共36页概述本文档的目的在于规范C代码撰写,所有软件工程师提交代码必须严格按照本文档执行。规则1.1 文件结构1.1.1 文件扩展名每个C程序分为两个文件。一个文件用于保存程序的声明(declaration),为头文件。另一个文件用于保存程序的实现(implementation),为定义(definition)文件。C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀。1.1.2 版权和版本的声明版权和版本的声明位于头文件和定义文件的开头。主要内容有:1. 版权信息;2. 文件名称,标识符,摘要;3. 当前版本号,作者/修改者,完成日期;具体的定义如下:/*Copyright (c)*-* 文 件 名: ?.c* 文件描述: ?* 作 者: (姓名、邮箱,QQ等)* 创建日期: 2009-12-01* 编译环境: Tornado2.0&Wind River Workbench 3.0 TOOL=diab* 硬件环境: ATMEL AT91SAM9G20 fclk=400M*-* 初始版本: V1.0*-修改记录-* 修 改 人: 甲乙丙丁* 修改日期: 2010.8.4* 当前版本: V1.1* 修改描述: 新增任务tidtaskTouchScreen*-*/代码区/* End Of File*/注意:1. 版权版本信息和文件信息必须出现在文件的最开始;2. 其中修改者信息不止一项。当第一位修改者修改完成后,提交到版本库时,必须填写修改者姓名、修改日期、修改的版本号以及修改描述;当第二位修改者修改后,在提交到版本库之前,也必须填写相关修改信息;3. 所有文件必须以”End Of File”字样结束,文件最后空一行;4. 代码区与文件头、尾信息之间各空一行。1.1.3 头文件和定义文件结构1.1.3.1 头文件结构一般头文件由四部分内容组成:1. 头文件开头处的版权声明和相关信息,详细规则见1.1.2;2. 预处理块,定义宏的区域,必须使用以下的注释,所有定义紧跟注释之后,不得出现在别的位置;/* Macros*/3. 定义数据类型,所有数据类型紧跟注释之后,不得出现在别的位置;/* Local Types*/4. 函数声明。对于普通函数声明,声明必须紧跟着定义的函数接口说明(参见定义文件第8部分),并且函数接口说明和定义文件中的接口说明必须是一致的。 1.1.3.2 定义文件结构定义文件由八个部分组成:1. 定义文件开头处版权声明和相关信息,详细规则见1.1.2;2. 定义该文件包含的头文件列表,所有#include语句只能出现在以下注释之后,不得出现在别的位置;/* Include Files*/3. 定义该文件使用的常量宏,该文件使用的宏(除个别控制编译的宏)必须出现在以下注释之后,不得出现在别的位置;/* Macros*/4. 定义该文件使用的局部类型,该文件中使用的局部数据类型,必须出现在以下注释之后,不得出现在别的位置;/* Local Types*/5. 定义该文件使用的局部常量,该文件使用的常量(const 定义)必须出现在以下注释之后,不得出现在别的位置;/* Manifest Constant*/6. 定义该文件使用的局部静态变量,该文件使用的静态变量(static 定义)必须出现在以下注释之后,不得出现在别的位置;/* Static Variables*/7. 定义该文件使用的局部静态函数原型,该文件使用的内部函数(static 定义)原型必须出现在以下注释之后,不得出现在别的位置;/* Internal Function Prototypes*/8. 定义该文件所提供的函数接口,每个函数或方法前必须加上以下注释。/* 函 数 名: Fuc_Demo()* 功能描述: ?* 输入参数: void* 返 回 值: void* 注 释: 1).通过更改宏定义_USED_AS_EXHIBIT_为TRUE来调用该函数 2).开机3秒后进入演示模式*/1.1.3.3 注意事项1. 如果.h文件是函数原型文件,使用宏只让其编译一次。紧跟头文件版权版本信息之后,定义如下宏;#ifndef _大写的文件名_H_#define _大写的文件名_H_/*头文件的四个部分*/#endif /* _大写的文件名_H_ */2. 不准在头文件内添加任何变量的定义;3. 如果.h文件中含有的是函数的配置宏,应使用宏命令,让其只能和配对的C文件一同使用;/*这是设备配置的头文件devCfg.h*/#ifdef USE_UART_CONFIG /*定义UART设置*/#endif#ifdef USE_SPI_CONFIG /*定义SPI设置*/#endif/*这是使用uart.cpp文件,需要使用devCfg.h文件*/.#define USE_UART_CONFIG#include .1.2 程序排版1.2.1 概述程序的排版追求清晰、美观,是程序风格的重要构成因素,有利于代码的阅读和维护。为了统一排版格式,以在Source Insight/UltraEdit等代码编辑器为基础,定义所有的排版标准。1.2.2 缩进、空行、空格与对齐1.2.2.1 缩进缩进:为了避免不同编辑器对TAB键的解释不同,所有缩进全部使用空格 键,不得使用TAB键(有时为了编辑的便捷,可在编辑器中将TAB键设置为由空格键代替,此时,可使用TAB键)。1. 函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格;2. case语句下的情况处理语句也要遵从语句缩进要求;3. 本文后面所说的缩进,在无特殊说明的情况下,都是指缩进一个单位,即4个空格。(本文所有缩进都是以一个单位,即4个空格进行)1.2.2.2 空行空行是用以区分不同的程序块,程序块间,加上空行以示区分。1. 函数空行:在每个函数定义结束之后都要加空行。函数内部的空行,在一个函数体内,逻辑上密切相关的语句之间不加空行,其它地方应加空行分隔;2. 代码空行:一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 。如:.THANDLE hProcess;TPROCESS_T procInfo;/* open the process handle */if(hProcess = OpenProcess(PROCESS_ALL, FALSE, pid) = NULL) return LSE_MISC_SYS;memset(&procInfo, 0, sizeof(procInfo);procInfo.idProc = pid;procInfo.hdProc = hProcess;procInfo.misc &= MSCAVA_PROC;return(0);.1.2.2.3 空格1. 数名之后不要留空格,紧跟左括号(,以与关键字区别;2. (向后紧跟;)、,、;向前紧跟,紧跟处不留空格;3. ,之后要留空格,如Function(x, y, z)。如果;不是一行的结束符号,其后要留空格,如: for (initialization; condition; update);4. 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如=、+=、+等二元操作符的前后应当加空格;5. 一元操作符如+、-、*(Address)等前后不加空格;6. 、.、-这类操作符前后不加空格;7. 关键字之后要留空格。像 const、virtual、inline、case等关键字之后至少要留一个空格,否则无法辨析关键字。像 if、 for、 while 等关键字之后应留一个空格再跟左括号(,以突出关键字;8. 对于表达式比较长的 for 语句和 if 语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0; i10; i+)和if (a=b) & (c= very_longer_variable12) & (very_longer_variable3 = very_longer_variable14) & (very_longer_variable5 = very_longer_variable16) dosomething();virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix, CMatrix rightMatrix);for (very_longer_initialization; very_longer_condition; very_longer_update) dosomething();#define MACRO_DEFINE() do sentence1; sentence2; sentence3; sentence4; while (0)3. 循环、判断等语句中若有较长的表达式或语句,则要进行适当的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。如:if (taskno max_act_task_number) & (n7stat_stat_item_valid (stat_item) . / program codefor (i = 0, j = 0; (i BufferKeywordword_index.word_length) & (j NewKeyword.word_length); i+, j+) . / program codefor (i = 0, j = 0; (i first_word_length) & (j second_word_length); i+, j+) . / program code 4. 若函数或过程中的参数较长,则要进行适当的划分。如:n7stat_str_compare(BYTE *) & stat_object, (BYTE *) & (act_task_tabletaskno.stat_object), sizeof (_STAT_OBJECT);n7stat_flash_act_duration( stat_item, frame_id *STAT_TASK_CHECK_NUMBER + index, stat_object );1.2.4 修饰符的位置将修饰符*和&紧靠变量名。如:int *mCurBufPos;char *btsName;int &aliasBuf = Buf;1.2.5 注释注释是对重要的代码行或段落进行提示(注释的其他用法请参考1.1文件结构)。1. 一律不得使用/,注释只能使用/* 注释内容 */,注释内容前后各留一个空格;2. 如果代码本来就是清楚的,则不必加注释;3. 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除;4. 注释应当准确、易懂,防止注释有二义性;5. 在注释中避免使用缩写,特别是不常用的缩写;6. 注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方;7. 对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。变量、常量、宏的注释应放在其上方相邻位置或右方。如:/* active statistic task number */#define MAX_ACT_TASK_NUMBER 1000#define MAX_ACT_TASK_NUMBER 1000 /* active statistic task number */8. 当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。如:if (.) . while (.) . /* end of while*/ . /* end of if*/9. 避免在一行代码或表达式的中间插入注释;10. 通过对函数或过程、变量、结构等正确的命名以及合理地组织代码的结构,使代码成为自注释的;11. 在代码的功能、意图层次上进行注释,提供有用、额外的信息,帮助读者理解代码,防止没必要的重复注释信息;12. 注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利准确的英文表达,禁止使用拼音、拼音与英文混合注释;13. 对变量的定义和分支语句(条件分支、循环语句等)必须编写注释;14. 于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释,有效防止无故遗漏break语句。如:case CMD_UP: ProcessUp(); break;case CMD_DOWN: ProcessDown(); break;case CMD_FWD: ProcessFwd(); if (.) . break;else ProcessCFW_B(); / now jump into case CMD_Acase CMD_A: ProcessA(); break;case CMD_B: ProcessB(); break;case CMD_C: ProcessC(); break;case CMD_D: ProcessD(); break;.1.2.6 可读性1. 注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。要求含两个或两个以上操作符的表达式必须用括号标识优先级。如: word = (high 8) | low (1)if (a | b) & (a & c) (2)if (a | b) (c & d) (3)如果书写为high 8 | lowa | b & a & ca | b c & d由于high 8 | low = ( high 8) | low,a | b & a & c = (a | b) & (a & c),(1)(2)不会出错,但语句不易理解;a | b c & d = a | (b c) & d,(3)造成了判断条件出错。2. 避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的枚举或宏来代替。如:if (Trunkindex.trunk_state = 0) Trunkindex.trunk_state = 1; . / program code应改为如下形式。#define TRUNK_IDLE 0#define TRUNK_BUSY 1if (Trunkindex.trunk_state = TRUNK_IDLE) Trunkindex.trunk_state = TRUNK_BUSY; . / program code3. 源程序中关系较为紧密的代码应尽可能相邻;4. 不要使用难懂的技巧性很高的语句,除非很有必要时。1.2.7 自定义类型1.2.7.1 struct/enum/union1. 如果是struct/enum/union类型,必须在定义时使用 typedef;2. 大括号左端和typedef为同一行,不另起新行;3. struct/enum/union 类型名称上必须加上tag前缀,而typedef定义的类型名称只是将struct/enum/union类型名称去掉tag前缀,加上T前缀;4. 内部定义必须缩进一个单位。/*used for debugging, report error*/typedef struct tagInfoHeader TINT32 v1; TINT32 v2; TUINT32 v3; TInfoHeader;/*used for identify device */typedef enum tagDeviceType dtNvRAM, dtLCD, dtPrinter, dtADC, dtDAC, dtUART, dtSPI, TDeviceType;1.2.8 预编译指令1. 预编译指令不受当前代码的缩进的影响,第一个预编译指令是不缩进;2. 若编译指令存在嵌套逻辑关系,缩进一个单位,以增强代码的可读性;3. 代码的缩进不受预编译指令的影响。#include #ifdef WIN32 #ifdef DEBUG #define WIN32_DEBUG #endif#endifint Func()#ifdef WIN32_DEBUG return (1);#else #ifdef WIN32 return (2); #endif#endif1.3 命名规则1.3.1 基本原则1. 标识符应该由其作用、目的来命名,应当直观且可以拼读,可望文知意,不必进行“解码”;2. 标识符最好采用英文单词或其组合,便于记忆和阅读,切忌使用汉语拼音、或拼音与英文的组合体来命名,程序中的英文单词一般不会太复杂,用词应当准确;3. 标识符的长度应当符合最小长度表达最大信息的原则;4. 识符最好采用英文单词或其组合,便于记忆和阅读。如果过名字过长,采用简写(见附件);5. 程序中不要出现仅靠大小写区分的相似的标识符;6. 程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解;7. 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。使用“名词”或者“形容词+名词”作为变量命名的主要元素;使用“动词+名词”作为函数命名的主要元素。如下所示;int minValue;int maxValue;int SetValue(. . .);int GetValue(. . .);8. 尽量避免名字中出现数字编号,如Value1/Value2等,除非逻辑上的确需要编号如Uart0/Uart1等。1.3.2 具体命名原则1. 局部变量:变量名首单词的字母小写,其他单词首字母应大写,非首字母均小写。注意:作用域在单个C文件内的局部变量必须用static关键字进行修饰;char uartTxBuf; /* Uart口发送缓冲区 */float curChargeCur; /* 当前充电电流 */int curBatIR; /* 当前电池内阻 */int *textBuf; /* 指向文字缓冲区的指针 */int *uartTxBuf; /* 指向uart发送缓冲区的指针 */static int localSem;/* 局部信号量 */2. 全局变量:变量名所有单词的首字母大写,其他字母小写,并在变量前加上 g_ 前缀;int g_ScreenType; /* 当前电池内阻 */int *g_LcdBuff; /* 指向文字缓冲区的指针 */3.4. 常量:const 定义的常量满足规则1的前提下,具有 _cnt 前缀,第一个单词的首字母大写。由 #define 定义的常量单词全部大写,当超过两个以上单词时,每个单词之间加 _ 分隔;const int _cntMaxValue = 100;#define NULL (0)#define CMD_READ_SPI_LINE read spi5. 函数名、函数指针:每个单词的首字母大写,其他字母全部小写。函数指针不加任何后缀。注意:作用域在单个C文件内的局部函数名全部小写,并用关键字static进行修饰;char (*GetRxChar)();char SpiGetRxChar();char UartGetRxChar();GetRxChar = SpiGetRxChar;GetRxChar = UartGetRxChar;6. 数据类型名:使用 typedef 定义的数据类型名称必须加上T前缀。单词首字母大写,其他字母均小写;紧跟 struct/union/enum 的类型名加上tag前缀。不容许出现匿名结构/联合/枚举;typedef int TINT;typedef struct tagVirtualNode TDataType data; struct tagVirtualNode *next; TVirtualNode;7. 枚举值命名:必须加上该枚举类型名称中所有单词首字母组成的前缀,前缀中的字母均小写。单词首字母大写,其他字母均小写;typedef enum tagDeviceType dtNvRAM, dtLCD, dtPrinter, TDeviceType;8. 结构/联合成员名:结构/联合成员名称命名规则同规则1;9. 函数/方法参数命名:如果参数是用来供函数使用的,并不利用其返回值,加上 in 前缀;如果参数用来返回值,加上 o 前缀;如果参数既传递参数给函数,也从函数内返回值,使用 io 前缀;注意:如果是带in 前缀的指针参数,必须加 const 符号进行修饰。void GetBiggestIdx(const TINT *inBuff, TINT ioSize, TINT *oIdx);1.4 表达式和基本语句1.4.1 表达式1. 如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级;word = (high = b & c d & c + f = g + h /* 复合表达式过于复杂 */d = (a = b + c) + r /* 既求a的值又求b的值,应该拆分为两个独立的语句 */if (a b c) /* a b c 是数学表达式不是程序表达式 */a = b = c; /* 用 c 对 a 和 b 连续的赋值,合理的复合表达式 */3. 逻辑表达式:逻辑表达式中数值和函数写在运算符左侧,变量写在运算符右侧;NULL = mBufGetValue() = 或 = -EPSINON) & (x = EPSINON) 其中EPSINON 是允许的误差(即精度);4. 将指针变量用=或!=与 NULL 比较;5. if 语句有多于一个分支时,必须具有 else 分支;1.4.2.2 for 语句1. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制;2. for 语句的循环控制变量的取值采用“半开半闭区间”写法;3. for语句里初使化不容许声明变量;4. 条件位置也不容许出现与循环变量无关的条件;5. 增量位置也不容许出现与循环变量无关的语句。1.4.2.3 switch 语句1. 每个case语句的结尾不要忘了加 break,否则将导致多个分支重叠(除非有意使多个分支重叠);2. case关键字和default关键字与switch关键字之间缩进一个单位。break关键字和语句与case关键字之间缩进一个单位;3. 即使程序真的不需要default处理,也应该保留语句default : break;语句。1.4.2.4 goto 语句goto语句只能有以下一种用法:从多重循环体中跳出,不使用 break语句(除非使用一条break语句即可跳出循环),采用 goto 语句直接跳出多重循环。除去以上的用法以外,不准在其他场合下使用 goto 语句。1.4.3 常量规则1.4.3.1 概述当程序中出现大量的立即数,程序的可读性变差。在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。所以尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。1.4.3.2 定义规则1. 需要对外公开的常量放在头文件中,不需要公开的常量放在定义文件的头部;2. 如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。例如:char float RADIUS=100.0;char float DIAMETER= RADIUS2.0;3. 如果是整型取值,范围又不大的常量(不超过整型变量的取值范围)可以采用枚举型变量定义。1.4.4 变量规则1. 去掉没必要的公共变量。公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间的耦合度;2. 当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生。对公共变量赋值时,若有必要应进行合法性检查,以提高代码的可靠性、稳定性;3. 防止局部变量与公共变量同名。若使用了较好的命名规则,那么此问题可自动消除;4. 严禁使用未经初始化的变量作为右值。在C中引用未经赋值的指针,经常会引起系统崩溃;5. 使用严格形式定义的、可移植的数据类型,尽量不要使用与具体硬件或软件环境关系密切的变量。如下例子,在移植时可能产生问题。void main() register int index; / 寄存器变量 _AX = 0x4000; / _AX是BC3.1提供的寄存器“伪变量” . / program code1.4.5 结构1. 结构的功能要单一,是针对一种事务的抽象。设计结构时应力争使结构代表一种现实事务的抽象,而不是同时代表多种。结构中的各元素应代表同一事务的不同侧面,而不应把描述没有关系或关系很弱的不同事务的元素放到同一结构中;2. 不要设计面面俱到、非常灵活的数据结构,反而容易引起误解和操作困难;3. 同结构间的关系不要过于复杂。若两个结构间关系较复杂、密切,那么应合为一个结构;示例:如下两个结构的构造不合理。typedef struct PERSON_ONE_STRU unsigned char name8; unsigned char addr40; unsigned char sex; unsigned char city15; PERSON_ONE;typedef struct PERSON_TWO_STRU unsigned char name8; unsigned char age; unsigned char tel; PERSON_TWO;由于两个结构都是描述同一事物的,那么不如合成一个结构。typedef struct PERSON_STRU unsigned char name8; unsigned char age; unsigned char sex; unsigned char addr40; unsigned char city15; unsigned char tel; PERSON;4. 结构中元素的个数应适中。若结构中元素个数过多可考虑依据某种原则把元素组成不同的子结构,以减少原结构中元素的个数;示例:假如认为如上的_PERSON结构元素过多,那么可如下对之划分。typedef struct PERSON_BASE_INFO_STRU unsigned char name8; unsigned char age; unsigned char sex; PERSON_BASE_INFO;typedef struct PERSON_ADDRESS_STRU unsigned char addr40; unsigned char city15; unsigned char tel; PERSON_ADDRESS;typedef struct PERSON_STRU PERSON_BASE_INFO person_base; PERSON_ADDRESS person_addr; PERSON;5. 仔细设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间,并减少引起误用现象。合理排列结构中元素顺序,可节省空间并增加可理解性;6. 结构的设计要尽量考虑向前兼容和以后的版本升级,并为某些未来可能的应用保留余地(如预留一些空间等);7. 编程时,要注意数据类型的强制转换。但尽量减少没有必要的数据类型默认转换与强制转换;8. 对编译系统默认的数据类型转换,也要有充分的认识。如下赋值,多数编译器不产生告警,但值的含义还是稍有变化;char chr;unsigned short int exam;chr = -1;exam = chr; / 编译器不产生告警,此时exam为0xFFFF。9. 合理地设计数据并使用自定义数据类型,避免数据间进行不必要的类型转换。自定义数据类型时要恰当命名,在同一产品中应统一,使它成为自描述性的,以提高代码可读性;10. 当声明用于分布式环境或不同CPU间通信环境的数据结构时,必须考虑机器的字节顺序、使用的位域及字节对齐等问题。必要时须用 #pragma pack() 指定对齐规则。1.5 函数规则1.5.1 参数规则1. 作用域仅在单个定义文件内部的函数,一律使用static进行修饰;2. 参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用void填充;3. 参数命名要恰当,顺序要合理,满足函数参数命名规则;4. 参数的顺序要遵循程序员的习惯。一般,应将目的参数放在前面,源参数放在后面。一些函数的输出参数,放在输入参数的后面;5. 如果参数是指针,且仅作输入用(带有in前缀),则应在类型前加const,以防止该指针在函数体内被意外修改;6. 如果输入参数以值传递的方式传递对象,则宜改用const&方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率;7. 避免函数有太多的参数,参数个数尽量控制在7个以内,如果参数太多,在使用时容易将参数类型或顺序搞错(建议使用结构体传递参数);8. 尽量不要使用类型和数目不确定的参数。如:int printf(const chat *format,argement.);1.5.2 返回值的规则1. 必须规定函数返回值的类型。如果函数没有返回值,则加上void关键字修饰;2. 函数名字与返回值类型在语义上不可冲突。如:char c;c=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校幼师绩效考核制度
- 事业单位文员考核制度
- 技术部门业绩考核制度
- 餐厅团队绩效考核制度
- 幼儿园监控检查考核制度
- 北京乐普销售考核制度
- 欧派衣柜门店考核制度
- 送教下乡学员考核制度
- 麻醉科三基培训考核制度
- 学校部门考察考核制度
- 律师理论考试试题及答案
- 2026秋招:神州数码集团笔试题及答案
- 中医体重管理科普
- 英语-湖北省荆州2026届高三年级元月质量检测(荆州宜昌荆门元调)
- 光伏电站热成像检测技术方案
- 2025心肺复苏指南
- 领导干部学习法治思想研讨发言汇编
- 铸造砂供货合同范本
- 2025至2030商用保温容器行业项目调研及市场前景预测评估报告
- 华为合伙人与股权分配方案
- 2025至2030中国汽车滤清器行业市场深度调研及需求分析与投资报告
评论
0/150
提交评论