首页 百科知识 宏不是类型定义

宏不是类型定义

时间:2023-09-22 百科知识 版权反馈
【摘要】:使用这样的宏定义还有着可移植性的优势——所有的C编译器都支持它。很多C编译器并不支持另一种方法:这两个定义使得T1和T2都等价于一个struct foo的指针。相反,第二个声明中c和d都被定义为指向结构的指针,因为T2的行为好像真正的类型一样。

6.2 宏不是类型定义

    宏的一个通常的用途是保证不同地方的多个事物具有相同的类型:

 

#define FOOTYPE struct foo

FOOTYPE a;

FOOTYPE b, c;

 

这允许程序员可以通过只改变程序中的一行就能改变abc的类型,尽管abc可能声明在很远的不同地方。

 

    使用这样的宏定义还有着可移植性的优势——所有的C编译器都支持它。很多C编译器并不支持另一种方法:

 

typedef struct foo FOOTYPE;

 

这将FOOTYPE定义为一个与struct foo等价的新类型。

 

    这两种为类型命名的方法可以是等价的,但typedef更灵活一些。例如,考虑下面的例子:

 

#define T1 struct foo *

typedef struct foo * T2;

 

这两个定义使得T1T2都等价于一个struct foo的指针。但看看当我们试图在一行中声明多于一个变量的时候会发生什么:

 

T1 a,b;

T2 c,d;

 

第一个声明被扩展为:

 

struct foo * a, b;

 

这里a被定义为一个结构指针,但b被定义为一个结构(而不是指针)。相反,第二个声明中cd都被定义为指向结构的指针,因为T2的行为好像真正的类型一样。

 

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈