typedef不是#define,这不仅指的是它们在一些细节上的不同,最关键的,也是对理解typedef最致命的,是对typedef语句结构的理解。
#define COLOR_RED #ff0000
这个语句,左-中-右 { 左:#define, 中:COLOR_RED, 右:#ff0000 }。这很好理解,用COLOR_RED来代表#ff0000。
typedef int myInt;
对于很多用typedef的地方而言,这句代码跟#define很像,好像也是个左-中-右结构,我们用myInt 来代表内置类型 int。但如果这样理解的话,那么下面这句:
typedef int int_array[4];
该怎么理解?用int_array[4]代表int?
更难以理解的:
typedef int (*PF) (const char *, const char *);
谁代表谁?左-中-右结构呢?
typedef与#define完全是两个思路。我觉得可以把typedef理解成一种运算符,单目运算符,而参与运算的对象是一句代码。比如前面说的:
typedef int myInt;
先去掉typedef,我们看到的代码是:
int myInt;
这是一句定义代码,定义了一个int类型的变量——myInt。
然后我们把myInt拿来typedef,类似于:
typedef myInt;
这样myInt就不再代表一个int类型的变量了,而是代表它原先代表的东西的类型,也就是int。
这有点像Java里面的getClass(),我们通过一个变量得到了该变量的类型。而且typedef这里还让这个变量发生了质变,直接代表了这个类型。
因此我们回头来看:
typedef int int_array[4];
去掉typedef,这里int int_array[4];定义了一个包含4个元素的整形数组int_array,现在加上typedef:
typedef int_array;
现在int_array代表一个类型,一个类,用这个类生成的对象是包含4个元素的整形数组:
int_array a;
a是一个包含4个元素的整形数组,也就是相当于直接定义int a[4];