宏的一个常见用途是,使多个不同变量的类型可在一个地方说明
#define foottype struct foo
footype a;
foottype b,c;
这样,编程者只需在程序中改动一行代码,即可改变a,b,c的类型,而与a,b,c在程序中的地方 申明无关
宏定义的这种用法有一个优点———可移植性,得到了所有c编译器的支持。但是,我们最好还是使用类型定义。
typedef struct foo footype;
这个语句定义了footype为一个新的类型,与struct foo完全等效。
这两种命名类型的方式似乎都差不多,但是使用typedef的方式要更加通用以写。例如,考虑下面的代码
#define t1 struct foo *
typedef struct foo *t2;
从上面两个定义来看,t1和t2从概念上完全符合,都是指向结构foo的指针。但是,当我们试图用他们来声明多个变量时,问题就来了;
t1 a,b;
t2 a,b;
第一个声明被扩展为:
struct foo *a,b;
这个语句中a被定义为一个指针结构的指针,而b却被定义为一个结构(而不是指针)。第二个声明则不同,它被定义了a,b都是指针结构的指针,因为这里的t2的行为完全与真实的类型相同。