【摘要】:使用这样的宏定义还有着可移植性的优势——所有的C编译器都支持它。很多C编译器并不支持另一种方法:这两个定义使得T1和T2都等价于一个struct foo的指针。相反,第二个声明中c和d都被定义为指向结构的指针,因为T2的行为好像真正的类型一样。
6.2 宏不是类型定义
宏的一个通常的用途是保证不同地方的多个事物具有相同的类型:
#define FOOTYPE struct foo
FOOTYPE a;
FOOTYPE b, c;
这允许程序员可以通过只改变程序中的一行就能改变a、b和c的类型,尽管a、b和c可能声明在很远的不同地方。
使用这样的宏定义还有着可移植性的优势——所有的C编译器都支持它。很多C编译器并不支持另一种方法:
typedef struct foo FOOTYPE;
这将FOOTYPE定义为一个与struct foo等价的新类型。
这两种为类型命名的方法可以是等价的,但typedef更灵活一些。例如,考虑下面的例子:
#define T1 struct foo *
typedef struct foo * T2;
这两个定义使得T1和T2都等价于一个struct foo的指针。但看看当我们试图在一行中声明多于一个变量的时候会发生什么:
T1 a,b;
T2 c,d;
第一个声明被扩展为:
struct foo * a, b;
这里a被定义为一个结构指针,但b被定义为一个结构(而不是指针)。相反,第二个声明中c和d都被定义为指向结构的指针,因为T2的行为好像真正的类型一样。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。