怎样写出工业级的C代码
1. 层次分明;结构清晰 ,模块划分
2.重要tips
a.从词法的角度来看,
熟悉C运算符号的优先级,特别是不能混淆=/&&/+-和移位等操作符之间的顺序:
常见容易混淆的顺序包括:
算术加减和移位操作:a>>b+1表示a>>(b+1),而非(a>>b)
+ 1;
自加/减和->/.运算符号:a->b.c;
++a->b
理解编译器对符号解析处理的过程:比如a+++b,到底是a++
+b还是a+
++b;
if
( a = b != c) {};
b.从语法的角度
嵌套注释不提倡,大部分编译器也不支持;
对宏的定义注意前提和局限:
比如 #define
max(A,B) A > B? A : B 改成
#define
max(A,B) (A)>
(B) ? (A) : (B)在A或者B中含有自加或者自减操作的时候也可能出错;
理解assert()宏内部的实现;
c.从语义的角度
即使某些看上去没有问题的代码,实际由于堆栈布局、内存分布、表示方法的局限也可能出现不是所期望的代码,比如下面的这些代码:
1
. int (int b)
{
return
-b;
)
2.
int test()
{
int
ii;
char
c
for
(ii=0;ii < 5; ii++)
scanf(“%d”,
&c);
}
3.
int a[10];
for
(i=0; i<=10;i++)
a[i]
= I;
4.
char * getname(char * myname)
{
char
* local_name;
local_name
= “Huogo”;
strcpy(myname,
local_name);
return
local_name;
}
5.
int a =5; int b = -3;
int
c = a / b;
int
d = a % b;
6.
int a = random();
int
b = random();
int
C = MAX_INT;
if
(a + b < c) {
….
}
if
( a * b < c) {
…..
}
7.
int mask = 0xffffff00;
long
in_addr = …...;
long
out_addr = 0;
out_addr
= mask & in_addr;
8.
int x =;
//
get half of x
half
= x >> 1;
9.
at a.c:
char
name[5];
at
b.c
extern
char * name;
10.
int a[3][5];
int
* pa[] = a;
int
* pb = a[0];
int
* pc = &[0][0];
pa++;
pb++;
pc++;
11.过多假定:
toUper(char
c)
{
if
(c <= ‘z‘ && c >= ‘a‘) {
return
c + ‘A‘ – ‘a‘;
}
return
c;
}
int
get_array_size(int * array, int len)
{
return
len<<2;
}
12.
unsigned c;
unsigned
char b;
int
d;
d
= c;
b
= c;
13.
char c = getchar();
while
( c != EOF) {
c
= getchar();
}