1 声明定义类
1.1 过程名禁止被重用
一个过程名禁止被重用于其它之处。
例如:
代码语言:c复制void foo (unsigned int p_1)
{
unsigned int x=p_1;
}
/***********
* 过程名禁止被重用
***********/
void static_p (void)
{
unsigned int foo=lu;
}
1.2 标号名禁止被重用
一个标号名被重用掩盖了这个标号名的含义。出现这种情况时,编译是否通过是依赖于编译器的差异而不同。
例如:
代码语言:c复制/***********
*标号名禁止被重用
***********/
void static_p (void)
{
unsigned int value_x=lu;
unsigned int y=0u;
/*...*/
value_x:
y=lu;
/*...*/
}
1.3 禁止在结构体定义中含有空域
在结构体定义中禁止含有空域。该准则的违背通常是出现在类似于如下的使用中:struct atag {struct anothertag {...}; ...};
例如:
代码语言:c复制/***********
* 禁止在结构体定义中含有空域
**********/
struct s_p (unsigned int xs; struct (unsigned char ac, ab; }; };
void static_p (void)
{
struct s_p sb;
sb.xs=1;
/*...*/
}
1.4 禁止声明多重标号
使用多重标号是多余的,多重标号完全可以用一个标号来替代。
例如:
代码语言:c复制/***********
* 禁止声明多重标号
**********/
static void static_p (void)
{
start: begin:
/*...*/
}
1.5 参数必须使用类型声明
虽然一些编译器允许缺省参数类型,但使用参数类型说明易于类型匹配的检查,因此参数必须使用类型声明。
例如:
代码语言:c复制/***********
*参数必须使用类型声明
**********/
unsigned int static_p(p_1)
{
unsigned int result;
/*...*/
result=p_1*2;
return result;
}
1.6 在过程声明中必须对参数说明
虽然大多数编译器允许在过程声明中省略任何的参数说明,但在过程声明中对参数进行说明易于对过程使用中参数类型匹配的检查,因此在过程声明中必须对参数说明。
例如:
代码语言:c复制/***********
* 在过程声明中必须对参数说明
**********/
int static_p();
int static_p (unsigned int p)
{
int x=1;
/*...*/
if (p==0)
{
x=0;
}
return x;
}
1.7 禁止过程参数只有类型没有标识符
一些编译器允许过程参数的说明只有类型而没有标识符,但这样的参数并不能真正地被使用,因此禁止过程参数只有类型没有标识符。
例如:
代码语言:c复制struct s_type_b {unsigned int xs;};
/***********
* 禁止过程参数只有类型没有标识符
**********/
void static_p_a (unsigned int p_1, struct s_type_b *);
void static_p_a (unsigned int p_1, struct s_type_b *)
{
/*...*/
}
1.8 禁止在过程参数表中使用省略号
过程参数用省略号说明不利于对参数匹配的分析,因此禁止在过程参数表中使用省略号。
例如:
代码语言:c复制/***********
* 禁止在过程参数表中使用省略号
**********/
unsigned int static_p (unsigned char* p_1, ...)
{
/*...*/
return lu;
}
1.9 禁止重新定义使用C或C 的关键字
重新定义使用C或C 的关键字,破坏了程序的可读性,因此禁止重新定义使用C或C 的关键字。
例如:
代码语言:c复制/***********
* 禁止重新定义使用C或C 关键字
**********/
void static_p (void)
{
unsigned int public =0;
unsigned int private =0;
unsigned int protected =0;
unsigned int operator =0;
unsigned int new =0:
unsigned int template =0;
unsigned int virtual =0;
unsigned int delete =0;
unsigned int friend =0;
unsigned int cout =0;
unsigned int cin =0;
unsigned int endl =0;
/*...*/
}
1.10 禁止过程或函数中的参数表为空
如果是一个无参数过程或函数,必须使用func(void)
的形式说明,禁止使用func()
的形式说明。
例如:
代码语言:c复制/***********
* 禁止过程或函数中的参数表为空
**********/
void satic_p ( )
{
/*...*/
}
1.11 禁止在同一个宏中使用多个#或
在同一个宏中使用多于一个的#或##,或同时使用#和##都是很危险的,因此禁止在同一个宏中使用多个#或##。
1.12 禁止定义不象函数的宏
定义带参数的宏(类函数宏)时,宏体必须用括号括起来。
例如:
代码语言:c复制#define IF_X (x) if(x){
/***********
*禁止定义不象函数的宏
**********/
void static_p (void)
{
bool test=true:
IF_X(test)
test=!test;
}
}
1.13 禁止在宏中包含不允许的项
宏只能用于符号常量,类函数宏,类型限定符以及存储类说明。宏中不允许含有语句关键字和类型关键字。
例如:
代码语言:c复制/***********
* 禁止在宏中包含不允许的项
**********/
#define static_p unsigned int
void test_p (void)
{
static_p x=lu;
/*...*/
}
1.14 禁止重新定义保留字
宏预处理可以重新定义保留字,但这种做法会引起混淆,因此禁止重新定义保留字。
例如:
代码语言:c复制/***********
* 禁止重新定义保留字
**********/
#define FILE unsigned int
void dummy (void)
{
/*...*/
}
1.15 字符型变量必须明确定义是有符号还是无符号
若对字符型变量不明确定义是否有符号,则在执行时会作为有符号或无符号的类型使用,因此要求字符型变量必须明确定义是有符号还是无符号。
例如:
代码语言:c复制/***********
* 字符型变量必须明确定义是有符号还是无符号
**********/
void static_p (void)
{
char c=‘c’;
/*...*/
}
1.16 禁止对一个名字重新定义
虽然C语言允许在许多不同的上下文中对一个名字重新定义,但命名的唯一性可使程序增加可读性,因此禁止对一个名字重新定义。
例如:
代码语言:c复制/***********
* 禁止对一个名字重新定义
**********/
unsigned int static_p (void);
struct static_p
{
unsigned int static_p;
unsigned int u_1 ;
};
unsigned int static_p (void)
{
unsigned int var_1;
/*...*/
static_p:
var_1=lu;
/*...*/
returm (var_1);
}
1.17 用typedef自定义的类型禁止被重新定义
改变用户自定义的类型会引起混滑甚至能导致错误,因此用typedef自定义的类型禁止被重新定义。
例如:
代码语言:c复制typedef int mytype:
/**********
* 用typedef自定义的类型禁止被重新定义
**********/
void static_p (void)
{
typedef float mytype;
/*...*/
}
1.18 禁止在同一个文件中有#if
而没有#endif
预处理语句的#if和#endif禁止分散在不同的文件之中。
1.19 禁止数组没有边界限定
禁止使用没有边界限定的数组定义。
例如:
代码语言:c复制/**********
* 禁止数组没有边界限定
**********/
void static_p (void)
{
unsigned int u_array[]={0, 1, 2};
/*...*/
}
1.20 禁止在#include<......>
中使用绝对路径名
头文件路径应该在编译器的选项中予以设置说明,禁止在#include<......>
中使用绝对路径名。例如:
/**********
* 禁止在#include<......>中使用绝对路径名
**********/
#include <C:VCincludestdio.h>
void Dummy (void)
{
/*...*/
}
1.21 禁止结构体声明不完整
结构体的声明必须要完整地声明。
例如:
代码语言:c复制/**********
* 禁止结构体声明不完整
**********/
struct static_p;
void dummy (void)
{
/*...*/
}
1.22 禁止参数的声明形式上不一致
在参数表的参数声明中,对所有参数的类型和变量名的声明形式上必须保持一致。推荐使用仅对参数类型进行声明的形式。
例如:
代码语言:c复制/**********
* 禁止参数的声明形式上不一致
**********/
float static_p (unsigned int, unsigned short p_2);
2 版面书写类
2.1 过程体必须用大括号括起来
基于加强代码可读性、避免人为失误的目的,过程体必须用大括号括起来。
2.2 循环体必须用大括号括起来
基于加强代码可读性、避免人为失误的目的,循环体必须用大括号括起来。例如:
代码语言:c复制/**********
* 循环体必须用大括号括起来
*********/
int static_p(int p_1)
{
int j=10;
int k=0;
/*...*/
for (k=0; k<10; k=k 1) j--;
return;
}
2.3 then/else中的语句必须用大括号括起来
基于加强代码可读性、避免人为失误的目的,then/else中的语句必须用大括号括起来。
例如:
代码语言:c复制/**********
*then/else中的语句必须用大括号括起来
*********/
int static_p (int p_1, int p_2)
{
int i=;
int j=2;
/*...*/
if (p_1>0) {
i=i-1;
} else
i=i 1;
if (p_2>0) {
j=j p_2;
} else if (p_2<0){
j-j-p_2;
}else{
j=i;
}
return i;
}
2.4 逻辑表达式的连接必须使用括号
在含有逻辑操作符的表达式中使用括号可使运算顺序变得清晰,且不容易出错,因此逻辑表达式的连接必须使用括号。
例如:
代码语言:c复制/**********
* 逻辑表达式的连接必须使用括号
*********/
void static_p (void)
{
bool flag=true;
unsigned int y=Ou, x=Ou, z=lu;
/*...*/
if (x<0 || z y!=0&&!flag)
{
flag=false;
}
}
2.5 禁止在头文件前有可执行代码
头文件应放在文件开始的地方,应在任何可执行代码之前。
例如:
代码语言:c复制/**********
* 禁止在头文件前有可执行代码
*********/
void static_p (void)
{
#include " myfile.h"
/*...*/
}
2.6 宏参数必须用括号括起来
宏体内使用的参数必须用括号括起来。
例如:
代码语言:c复制/**********
* 宏参数必须用括号括起来
*********/
#define static_p(x) x>=0?x:-x
void test_p (void)
{
unsigned int result;
int a=6, b=5;
/*...*/
result=static_p(a-b);
result=static_p(a) 1;
/*...*/
}
2.7 嵌入汇编程序的过程必须是纯汇编程序
该准则是为了确保所有插入的代码是有界面定义的纯过程。
例如:
代码语言:c复制/**********
* 恢入汇编程序的过程必须是纯汇编程序
*********/
void static_p (void)
{
unsigned int x;
x=0u;
_asm
{
mov eax, x
}
}
2.8 头文件名禁止使用“‘”
、“”
和“/*”
等字符
头文件名使用“‘”
、“”
和“/*”
等字符会带来隐含的冲突,因此头文件名禁止使用“‘”
、“”
和“/*”
等字符。