1、逻辑判断是否相等“==”,被误写成赋值等号“=”
else if(buf[0] == '\0')
逻辑判断 与 赋值运算 的括号 匹配错误,例:if( (fd=open("temp.txt", O_RDONLY) < 0) )
改正:
136 if((fd=open("temp.txt", O_RDONLY)) < 0)
137 {
138 write(sockfd, "ERROR: fail to ls server file\n",
139 strlen("ERROR: fail to ls server file\n"));
140 return -1;
141 }
2、宏定义续行符\ 后面不能有空格
warning: backslash and newline separated by space [enabled by default]
3 #define del_blank(p, cline) do{ \
4 while(cline[p]!='\0' && (cline[p]==' ' || cline[p]=='\t')) \
5 p++; \
6 }while(0)
3、 宏定义中的变量 不能与函数中的变量 同名
8 // 宏定义中的变量 不能与函数中的变量 同名
9 #define get_arg(arg, p, cline) do{ \
10 int j = 0; \
11 while(cline[p]!='\0' && cline[p]!=' ' && cline[p]!='\t') \
12 arg[j++] = cline[p++]; \
13 }while(0)
29 get_arg(command->argv[i], p, cline);
4、交换两个数,避免使用异或运算
9 #define swap(a, b) do{ \
10 (a) = (a) ^ (b); \
11 (b) = (b) ^ (a); \
12 (a) = (a) ^ (b); \
13 }while(0)
当a和b为数组中的同一个元素时,异或运算的交换就会出错,数组中的该元素将被置为0。原因是,a和b存储在同一个地址空间,第一步异或运算的结果就将该空间的值置为0了。
下面这个也不行
#define swap(a, b) do{ \
(a) = (a) + (b); \
(b) = (b) - (a); \
(a) = (a) - (b); \
}while(0)
必须得定义一个临时变量,而且该临时变量不能与函数中的变量同名