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;

原文地址:https://www.cnblogs.com/dzy521/p/9413859.html