C陷阱与缺陷读书笔记(三)
第四章 连接 没有看好,需要回过头再看
4.1 static修饰符
第五章 库函数 暂且跳过
第六章 预处理器(宏的总结)
6.1 宏定义中不能有空格
#define f (x) ((x)-1) //only define f, not f(x) #define f(x) ((x)-1) //define f(x)
但是调用不受空格影响
f(3) == 2 f (3) == 2
6.2 宏非函数,建议定义时把变量与整体用括号括起来,这样更加安全,例如:
#define max(a,b) ((a)>(b)?(a):(b))
同时,不要使用类似
max(a++,b);
这样方式,因为这样a++可能执行两次。
6.3宏并非语句,注意分号。
6.4 宏并非类型定义,typedef比宏好,例如:
#define TI struct foo* typedef struct foo* T2; T1 a,b; T2 a,b; struct foo* a,b; //对于第一个声明,a变成了指针,b为一个结构体 //第二个声明完成了类型的定义
第七章 可移植性的缺陷
7.2 C实现必须能够区分前6个字符不同的外部名称,且这个定义中并不区分大小写。例如:
char * Malloc(unsigned n) { char *p, *malloc(unsigned); p = malloc(n); if(p == NULL) panic("out of memory"); return p; }
上述代码会陷入迭代,因为编译器无法区分malloc与Malloc。
7.4 将有符号char转换为无符号应: (unsigned char) c;