求C语言的代码规范

热学沸腾56 2009-08-10 08:07:07
准备做一个C语言代码规范检查的东东。。
希望大家提供一些相关的资料。。
谢谢!!
...全文
405 26 打赏 收藏 转发到动态 举报
写回复
用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)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧