typedef

Typedef 的缺点

typedef 可能导致大型 C 程序中命名空间的污染。

Typedef 结构的缺点

此外,没有标签名称的 typedef’d 结构是不必要的头文件之间的排序关系的主要原因。

考虑:

#ifndef FOO_H
#define FOO_H 1

#define FOO_DEF (0xDEADBABE)

struct bar; /* forward declaration, defined in bar.h*/

struct foo {
    struct bar *bar;
};

#endif

有了这样的定义,不使用 typedefs,编译单元可以包含 foo.h 来获得 FOO_DEF 的定义。如果它不试图取消引用 foo 结构的 bar 成员,则不需要包含 bar.h 文件。

Typedef vs #define

#define 是一个 C 预处理器指令,它也用于定义类似于 typedef 的各种数据类型的别名,但有以下区别:

  • typedef 仅限于为类型提供符号名称,因为 #define 也可用于定义值的别名。

  • typedef 解释由编译器执行,而 #define 语句由预处理器处理。

  • 请注意,#define cptr char *后跟 cptr a, b;typedef char *cptr; 不同,后跟 cptr a, b;。使用 #defineb 是一个普通的 char 变量,但它也是 typedef 的指针。