怎样写出工业级的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();

}