社区
C语言
帖子详情
求C语言的代码规范
热学沸腾56
2009-08-10 08:07:07
准备做一个C语言代码规范检查的东东。。
希望大家提供一些相关的资料。。
谢谢!!
...全文
405
26
打赏
收藏
求C语言的代码规范
准备做一个C语言代码规范检查的东东。。 希望大家提供一些相关的资料。。 谢谢!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
26 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zld034
2009-09-18
打赏
举报
回复
我也对你的研究方向感兴趣,不知你现在做到什么程度?我的qq:18354863,有兴趣的话,交流一下?
zld034
2009-09-16
打赏
举报
回复
《代码大全》,必看
fedora1985
2009-08-12
打赏
举报
回复
4.2.4. 类型转换
1) 【规则03-02-01】浮点数类型(double, float, long double)指针不可转换为整型(int, long, short, char)指针.
(C, 03-02-01_DonNotCastingFloatPointerToIntegralPointer.rule)
2) 【建议03-02-02】给长整型, 浮点型(包括double)型, 无符号型赋值常数时, 常数后需要增加后缀以明确指明常数类型(避免超过值域范围).
(E, 03-02-02_TypeSuffixForNumericConstants_1(1-4).rule, 平台相关,当前规则文件中为32位平台.)
3) 【规则03-02-03】不得用8进制数常数.
(C, 03-02-03_DoNotUseOctalConstants.rule)
4) 【规则03-02-04】禁用隐式类型转换(implicit conversions).
注意:这里对于BREW移植定义的全局变量,无法对指针进行三级及三级以上的识别。
(C, 03-02-04_1_1DoNotUseImplicitConversion.rule;)
(C, 03-02-04_1_2DoNotUseImplicitConversion.rule)
(C, 03-02-04_1_3DoNotUseImplicitConversion.rule)
(C, 03-02-04_1_4DoNotUseImplicitConversion.rule)
(C, 03-02-04_2_1DoNotUseImplicitConversion.rule)
(C, 03-02-04_2_2DoNotUseImplicitConversion.rule)
5) 【规则03-02-05】非指针类型不得强制转换为指针类型, 指针类型也不得强制转换为非指针类型.
(C, 03-02-05_PointerNonPointerCast.rule)
6) 【规则03-02-06】使用条件语句'if'时, 条件表达式必须显示指明比较对象, 不得使用类似if (a)的方式隐式的与0值比较.
(C, 03-02-06_UseExplicitTestsAgainstZeroInIfCondition.rule)
7) 【推荐03-02-07】char类型使用时不允许用负值。
(C, 03-02-07_NotUseNegativeOfCharType.rule)
8) 【推荐03-02-08】&作为取地址操作符时,其后的变量不能是指针或数组类型
(C.03-02-08TheVariablesTypeRuleAfterOP.rule)
4.2.5. 类型赋值
1) 【规则03-03-01】数组作为函数的参数传递时, 只传入数组首地址指针和数据大小, 不能将整个数组作为参数传递. 多位数组存在时, 须传入首行的地址.
(C, 03-03-01_ArrayMagnitudeAsFunPara.rule)
2) 【规则03-03-02】结构体类型使用'={成员1, 成员2}'方式初始化时, 初始化值的类型需要与结构体成员声明的类型保持一致性.
(C, 03-03-02_TagAgreeDeclaration.rule)
3) 【规则03-03-03】多维数组赋值时, 需要用'{', '}'分割对应维度的赋值内容.
(C, 03-03-03_UseCurlyBracesToMatchStructure.rule)
4) 【规则03-03-04】枚举(enum)类型的成员在赋值时, 除可只对第一个成员外, 不允许对其他成员间隔性赋值, 必须全部显示赋值或使用其默认值.
(C, 03-03-04_EnumMembersInitRules.rule)
5) 【规则03-03-05】'do…while', 'if', 'while'条件判断中的布尔表达式中, 禁止使用赋值('=')表达式.
(C, 03-03-05_AvoidAssignmentsInBooleanExpr.rule)
6) 【规则03-03-06】赋值表达式的两侧的运算数不得使用'++', '-–', '+'(取正), '-'(取相反数)的运算符, 避免构成的复杂表达式在不同编译环境下产生歧义.
(C, 03-03-06_ComplexExpressionEvaluation.rule)
7) 【规则03-03-07】数组成员通过'[', ']'访问赋值时, 不得在下标计数和所赋值的数的计算时使用'++', '-–'操作, 避免构成的复杂表达式在不同编译环境下产生歧义.
(C, 03-03-07_ArrayAssignComplexExpressionEvaluation_1.rule, 03-03-07_ArrayAssignComplexExpressionEvaluation_2.rule)
8) 【规则03-03-08】指针变量必须初始化.
(C, 03-03-08_InitPointerVar.rule)
9) 【规则03-03-09】头文件中只允许出现静态/全局变量的声明,定义需要放在.C文件中。
(C, 03-03-09_NoInitGlocalStaticVar.rule)
fedora1985
2009-08-12
打赏
举报
回复
4.1.3. 注释规则
1) 【规则01-03-01】代码文件(包括头文件(.h)和源代码文件(.c))的文件开头中均需要增加类似如下的说明内容:, 所有文件均依此开头
/*
* Copyright(c) Xiamen AutoNavi Company. Ltd.
* All Rights Reserved.
*
* File: fileA.c
* Purpose: to Print something.
*
* Version: 0.02
* Author: UserB.
* Update: modify Bug A.
*
* Version: 0.01
* Author: UserA.
* Update: Create.
*
*/
(C, 01-03-01_DeclareInTheHeadOfTheFile.rule)
2) 【规则01-03-02】在头文件(.h)中,为了防止头文件被重复引用,应当用#ifndef/#define/#endif来声明宏,宏以__[头文件名小写]_h_的方式命名,例如在文件libloc.h中:所有.h文件必须存在如下宏定义(注释可用//替代)
#ifndef __libloc_h_
#define __libloc_h_
Struct Defination
Function delcaration
…
#endif /* __libloc_h_ */
(C, 01-03-02_TheHeadOfTheFilehaveDeclared.rule)
3) 【规则01-03-03】在头文件(.h)中,为保证在C++编译环境下正确编译,应当用#ifndef/#endif来辅助确定函数编译方式,例如:所有.h中的必须存在, 包含且仅包含函数声明部分.
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
Struct Defination
Function declaration
…
#ifdef __cplusplus
}
#endif /* __cplusplus */
(C, 01-03-03_DeclarationCFromC++WithIfdef.rule)
4) 【规则01-03-04】注释以/*[空格]被注释内容[空格]*/或//[空格]被注释内容[行末]组成,/*后和*/前(//后)必须预留至少1个空格或TAB.
(C, 01-03-04_CommentHaveMoreSpace.rule)
5) 【建议01-03-05】建议只使用C语言风格(/* */)的注释形式.(已删除)
6) 【规则01-03-06】使用'/*'注释时不得进行嵌套注释.
(C, 01-03-06_DoNotNestComments.rule)
7) 【规则01-03-07】函数前必须添加注释.
(C, 01-03-07_CommentBeforeFunction.rule)
8) 【规则01-03-08】#endif后必须有注释标明该#endif对应的宏编译条件.
(C, 01-03-08_DeclareConditionAfterEndif.rule)
4.2. 命名规范
4.2.1. 通用规则
1) 【规则02-01-01】标识符名称(包括类, 结构体, 枚举, 联合, 变量, 函数名等)不得超过31个字符.
(C, 02-01-01_DoNotUseLongIdentifiers.rule)
2) 【推荐规则02-01-02】基本类型(long, int, char等)需要以别名(typedef)后的形式(gd_long, gd_int, gd_char)使用, 不得直接使用.
(D, 02-01-02_UseTypedefsForBasicTypes.rule)
3) 【规则02-01-03】别名名称(typedef后的名称)不得再用于变量名或函数名.
(C, 02-01-03_DoNotReuseTypedefNames.rule)
4.2.3. 通用规则
1) 【建议03-01-01】便于代码易读性, 建议不使用'goto'语句
(E, 03-01_DontUseGotoStatement.rule)
2) 【建议03-01-02】结构体内不得声明函数.
(E, 01-03-05_UseCStyleComments.rule)
3) 【规则03-01-03】for循环语句中不得使用'break'语句.(已删除)
4) 【规则03-01-04】switch语句中必须含有'default'分支.
(C, 03-01-04_DefaultInSwitch.rule)
5) 【建议03-01-05】由于可能会导致产生歧义运行流程, 建议不使用do…while的循环体模式.
(E, 03-01-05_DoNotUseDoWhile.rule)
6) 【建议03-01-06】由于高位符号位可能丢失, 建议不使用左移位运算符'<<'.
(E, 03-01-06_DoNotUseLeftShifts.rule)
7) 【规则03-01-07】不得使用三位转义字符(trigraph)表示常用字符(如'??='表示'#', '??('表示' ['等).
(C, 03-01-07_DoNotUseTrigraphs.rule)
8) 【规则03-01-08】函数使用前必须先声明.
(C, 03-01-08_AlwaysDeclareBeforeUse.rule)
9) 【规则03-01-09】禁止在局部作用域内覆盖全局变量.
(C, 03-01-09_DoNotHideGlobalVariables.rule)
10) 【建议03-01-10】建议禁用全局变量.(已删除)
11) 【规则03-01-11】外部对象(extern)的声明不得在相关文件组织中分散多次声明, 应集中于一处声明.
(C, 03-01-11_ExternalObjectsDeclareInOneFile.rule)
12) 【建议03-01-12】不建议使用寄存器类型(register)的变量.
(E, 03-01-12_DoNotUseRegisterStorage.rule)
13) 【推荐规则03-01-13】非静态变量需要在声明处初始化.
(C, 03-01-13_InitializeVariablesAtDeclaration.rule)
14) 【规则03-01-14】二元逻辑运算符('&&', '||')的右值不得使用'++', '—', 函数调用, 以避免编译环境带来的边界效应(side effect).
(C, 03-01-14_AvoidSideEffectsInLogicalOperator.rule)
15) 【规则03-01-15】'do…while', 'while', 'if', 'for', 'switch'的条件判断语句中, 禁用位逻辑运算符('&', '|', '~').
(C, 03-01-15_DoNotUseBitwiseOptInConditionStatements.rule)
16) 【规则03-01-16】位逻辑运算符(bitwise)的操作对象不得为有符号数.
(C, 03-01-16_BitwiseOperationOnSignedInteger.rule)
17) 【规则03-01-17】移位运算符使用时, 其移位个数不得超过操作对象的最大长度.
(C, 03-01-17_InvalidRangeOfShiftOperand.rule,平台相关,当前规则文件中为32位平台)
18) 【规则03-01-18】一元取负操作符('-')不得作用于无符号数上.
(C, 03-01-18_AvoidUnaryMinusForUnsignedExpr.rule)
19) 【规则03-01-19】如若使用了库函数'sizeof', 则其参数不得使用'++', '—', 以避免编译环境带来的边界效应.
(C, 03-01-19_AvoidSizeofUseExprsWithSideEffects.rule)
20) 【规则03-01-20】浮点数(包括double)不可用于直接(不)相等的比较.
(C, 03-01-20_AvoidExactEqualsOnFloats.rule)
21) 【规则03-01-21】禁止代码中存在逻辑不可达的代码段, 如:
if (1)
{ do something }
else
{ code unreachable }
(C, 03-01-21_AvoidUnreachableCode_1.rule, 03-01-21_AvoidUnreachableCode_2.rule)
22) 【规则03-01-22】多级条件语句if…else使用时, 必须显示注明所有的else分支.
(C, 03-01-22_ProvideFinalElseClause.rule)
23) 【规则03-01-23】使用条件分支语句'switch'时, 每一个分支(除default外)必须存在'break'语句.
(C, 03-01-23_TerminateCaseWithBreak.rule)
24) 【规则03-01-24】使用条件分支语句'switch'时, 条件表达式中不得使用布尔型(boolean)变量.
(C, 03-01-24_NoBooleanInSwitchExpression.rule)
25) 【规则03-01-25】使用条件分支语句'switch'时, 必须存在分支.
(C, 03-01-25_AvoidSwitchWithNoCase.rule)
26) 【规则03-01-26】循环语句'for'使用的计数器, 不得使用浮点数(包括double).
(C, 03-01-26_DoNotUseFloatsAsLoopCounters.rule)
27) 【规则03-01-27】循环语句'for'的表达式中不得使用与循环体无关的语句.
(C, 03-01-27_OnlyRelatExpressionInLoopStatement.rule)
28) 【规则03-01-28】循环语句'for'中的计数器, 不允许在循环体内部修改.
(C, 03-01-28_DoNotModifyCounterInForLoopBody.rule)
29) 【规则03-01-29】函数声明时要么全部声明其参数的标识符, 要么全部不声明(仅保留类型).
(C, 03-01-29_ProvideAllOrNoneArgumentNames.rule)
30) 【规则03-01-30】函数如若无参数, 需要在其参数处明确注明'void'.
(C, 03-01-30_UseVoidForFunctionsWithNoArgs.rule)
31) 【规则03-01-31】函数声明时必须指明其返回值类型,不得为void类型.
(C, 03-01-31_ProvideExplicitReturnType.rule)
32) 【规则03-01-32】函数的指针(引用)参数, 如若在函数体内仅仅作为右值(使用但未对其内容进行修改)使用时, 需要增加const的参数.
(C, 03-01-32_UseConstForArgsPassedByRef.rule)
33) 【规则03-01-33】当全局变量仅在一个函数内使用, 需要将其设定为局部变量.
已删除
fedora1985
2009-08-12
打赏
举报
回复
4.1.1. 通用规则
1) 【建议01-01-01】每个代码行最大长度不能超过100个字符.
(E, 01-01-01_LineLengthLessThan80.rule)
2) 【建议01-01-02】单个函数最大长度不得超过110行,超过部分以函数调用的方式整理。
(E, 01-01-02_AvoidFunctionLongerThan100Lines.rule)
3) 【规则01-01-03】每行只能进行一个或一类变量声明.
(C, 01-01-03_OneStatementPerLine.rule)
4) 【规则01-01-04】头文件包含操作(#include)必须在变量, 结构体, 函数声明之前完成.
(C, 01-01-04_IncludeStatements.rule)
5) 【规则01-01-05】头文件包含操作(#include)中, 最好不使用路径, 以避免不同平台的表示路径的路径符号不同产生的可移植性问题, 如必须要添加路径时, 以'/'作为目录路径分隔符.(不同平台下的路径分隔符不同)
(C, 01-01-05_AvoidNonStandardCharsInInclude.rule)
6) 【规则01-01-06】宏定义必须在变量, 结构体, 函数声明之前完成。
(C, 01-01-06_PreprocessorDirectivesStatement.rule)
7) 【规则01-01-07】和【规则01-01-08】依次进行结构体, 全局变量, 静态全局变量, 函数声明的顺序声明。
(C, 01-01-07_DeclarationByTurn.rule)
(C, 01-01-08_DeclarationByTurn.rule)
8) 【建议01-01-09】禁止包含库函数头文件
(E, 01-01-09_Don'tContainLibraryFunction.rule)
9) 头文件包含应当遵循最小包含. 不跨模块包含头文件. 如若使用其他模块的函数, 以extern方式在使用文件中(.c)中声明。
4.1.2. 缩进, 空格,括号使用规则
1) 【规则01-02-01】如if、for、while, switch关键字之后应留一个空格再跟左括号'('。
(C, 01-02-01_SpaceAfterKeywordWhileIfWhileSwitch.rule)
2) 【规则01-02-02】函数名之后不要留空格,紧跟左括号'(',以与关键字区别。
(C, 01-02-02_NoSpaceAfterTheFunctionName.rule)
3) 【规则01-02-03】','之后要留一个空格,如Function(x, y, z)。
(C, 01-02-03_SpaceAfterAllComma.rule)
4) 【规则01-02-04】如果';'不是一行的结束符号,其后要留一个空格,如for (initialization; condition; update)。
(C, 01-02-04_SpacesAfterSemicolon.rule)
5) 【规则01-02-05】一元运算符(++(前置), --(前置), ~, !)向后往操作对象紧缩.
(C, 01-02-05_UnaryOperatorAnighToOperand_backward.rule)
6) 【规则01-02-06】自操作一元运算符(++(后置), --(后置)向前往操作对象紧缩.
(C, 01-02-06_UnaryOperatorAnighToOperand_forward.rule)
7) 【规则01-02-07】关系运算符('>', '<', '>=', '<=', '==', '!=')前后应加空格.
(C, 01-02-07_OneSpaceBefore(after)RelationalOp.rule)
8) 【规则01-02-08】成员运算符('.', '->')前后不得存在空格.
(C, 01-02-08_NoSpacePrecedingOrFollowingSelector.rule)
9) 【规则01-02-09】赋值运算符('=', '%=', '&=', '*=', '/=', '+=', '-=', '<<=', '>>=', '^=', '|=')前后需要添加一个空格.
(C, 01-02-09_SpaceSurroundAssignmentOp.rule)
10) 【规则01-02-10】二元位运算符('^', '|', '<<', '>>')前后需要添加一个空格(不包括可能为引用或取址操作'&'运算符和一元位运算符'~').
(C, 01-02-10_SpaceSurrendBitwiseOp.rule)
11) 【规则01-02-11】'&'作为取址操作符或引用操作符时, 向操作对象紧缩; 作为按位运算符时前后需要添加一个空格.
(C, 01-02-11_1_OneSpaceBefore(after)OP.rule)
(C, 01-02-11_2_OneSpaceBefore(after)OP.rule)
12) 【规则01-02-12】二元逻辑运算符'&&', '||'前后需加一个空格.
(C, 01-02-12_SpaceSurrendLogicalOp.rule)
13) 【规则01-02-13】'{', '}'用以作为代码块功能时单独占一行(enum除外), 仅当作为初始化用途时可在同一行内使用.
(C, 01-02-13_FunctionCurlyBraces4{.rule)
14) 【规则01-02-14】条件语句'if', 'else'后, 需添加'{', '}'以明确条件执行语句区域.
(C, 01-02-14_NoCurlyBracesInConditionStatement.rule)
15) 【规则01-02-15】循环语句do…while和while, for后, 需添加'{', '}'以明确条件执行语句区域.
(C, 01-02-15_UseCurlyBracesInLoop.rule)
16) 【规则01-02-16】二元逻辑运算符'&&', '||'前后的操作对象必须为基本表达式(primary expression), 必要时, 需使用'(', ')'构成基本表达式.
(C, 01-02-16_LogicalOperadsPrimaryExpression_1_left.rule, 01-02-16_LogicalOperadsPrimaryExpression_2_right.rule)
17) 【规则01-02-17】宏定义表达式中具有参数时,参数必须用'(', ')'包括起来.
(C, 01-02-17_UseParenthesesForMacroArguments.rule)
18) 【规则01-02-18】'do while'语句中,在while后面要紧跟 '}'
(C, 01-02-18_WhileMustBeAfter}InDoWhile.rule)
热学沸腾56
2009-08-12
打赏
举报
回复
谢谢各位...
ayiso
2009-08-12
打赏
举报
回复
[Quote=引用 7 楼 airhiphop 的回复:]
Windows的很多使用微软的那套什么什么风格的
Linux的么当然是Linux的内核风格咯
[/Quote]
匈牙利法
wchhei
2009-08-12
打赏
举报
回复
编程风格如果规范得太死,还不如没有规范!
最重要的是,要让代码容易看,看得懂,其他的不用计较太多啊,不然只是白白浪费时间!
zgjxwl
2009-08-11
打赏
举报
回复
[Quote=引用 4 楼 supermegaboy 的回复:]
引用楼主 huwuling922 的回复:
准备做一个C语言代码规范检查的东东。。
希望大家提供一些相关的资料。。
谢谢!!
去找这个看:
Recommended C Style and Coding Standards
[/Quote]
e..
fiveyes
2009-08-11
打赏
举报
回复
百度一下吧
微软编程规范:
http://download.csdn.net/source/570519
C语言编程规范:
http://download.csdn.net/source/570519
lzy0001sl
2009-08-11
打赏
举报
回复
我是用的 高质量编程指南 林锐写的。感觉还不错阿。
热学沸腾56
2009-08-11
打赏
举报
回复
[Quote=引用 13 楼 chenee543216 的回复:]
或者你想作的是这个?:pc lint
[/Quote]
恩,静态代码规范检查...
Arnold9009
2009-08-11
打赏
举报
回复
国内的编程风格五花八门,各种内部规范多如牛毛,整一个通用的编程规范检查器貌似很困难的说
chenzhp
2009-08-11
打赏
举报
回复
1. 注释
程序中必须有清晰的注释;
程序头部要有程序整体说明信息;
每个函数(main除外)都要有注释说明该函数的功能,及其参数和返回值的意义;
每个变量都要有注释说明其用途(for 循环中的下标除外);
代码中要有适当的注释说明代码段的功能。
2. 缩进
缩进的宽度为4个字符,鼓励用空格缩进, tab亦可(但尽量避免两者混用);
凡函数、if、while、for、do-while、switch等都要使用缩进,具体形式参考示例代码。
3. 标识符命名
凡标识符的命名要尽量能直观反映该标识符的功能(如做到这一点,可免去注释说明);
标识符用英文命名,不可用汉语拼音;
变量命名采用“variable_name”的形式;
函数命名采用“FunctionName”的形式;
宏、常量、枚举的命名采用“MACRO_NAME”的形式。
4. 空行及空格
以增强可读性为目标,适当使用空行和空格;
不可出现连续的两个及两个以上的空行;
代码功能段之间用空行分隔;
不在行尾的每个逗号和分号后要有一个空格;
一般每个运算符前后都要有一个空格;
if, while, for, do, switch 和判断条件之间要有一个空格。
5. 其它
左大括号“{”后不可出现代码;
右大括号“}”前不可出现代码;
每行只能写一条代码,且该行代码总长不可超过80个字符;
常数应定义为宏、枚举或常量;
lijian22500
2009-08-11
打赏
举报
回复
[Quote=引用 2 楼 sonicrang 的回复:]
LZ...一定要看林锐的《高质量程序设计》……
[/Quote]
那本说可以,lz一定得看看。老外的书也得看看
unsv29
2009-08-11
打赏
举报
回复
你是弄哪方面的??
嵌入式的? 还是搞纯软件的?
wanghao111
2009-08-11
打赏
举报
回复
google baidu
chenee543216
2009-08-11
打赏
举报
回复
或者你想作的是这个?:pc lint
chenee543216
2009-08-11
打赏
举报
回复
英国工业控制C标准,不知道你敢不敢让你的小弟用这个?哈哈~~
Misra C编程标准
airhiphop
2009-08-11
打赏
举报
回复
Windows的很多使用微软的那套什么什么风格的
Linux的么当然是Linux的内核风格咯
加载更多回复(6)
华为技术有限公司
c语言
编程
规范
.pdf.zip_
C语言
规范
_pdf_weak9pr_华为
代码
规范
_华为
c语言
规范
华为的
代码
规范
,
C语言
版,适合嵌入式行业的工程师
c语言
代码
规范
的含
c语言
代码
的格式
对于刚学习
c语言
,不懂得
c语言
代码
规范
的人很有帮助
C++
代码
规范
和Doxygen根据注释自动生成手册
《C++
代码
规范
和Doxygen根据注释自动生成手册》讲师:夏曹俊 课程收益 学会C++
代码
规范
,并理解为什么要有这些
规范
。 学会C++
代码
注释
规范
,并能自动生成文档。 适合人群 C++初学者,掌握
代码
规范
项目管理者制定...
不看后悔嵌入式
C语言
代码
规范
嵌入式
C语言
代码
规范
快速达到大型企业的
代码
规范
代码
规范
是程序编辑的第一步 让写
代码
信心满满
华为
C语言
编程
规范
PDF
华为
C语言
编程
规范
高清PDF版 内容可复制
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章