typedef 容易误解,typedef 的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个别名,而非定义一个新的数据类型。
一、我们看一下比对:
typedef struct student
{
//code
}Stu_st,*Stu_pst;//命名规则请参考本章前面部分
A),struct student stu1;和Stu_st stu1;没有区别。
B),struct student *stu2;和Stu_pst stu2;和Stu_st *stu2;没有区别。
好,下面再把typedef 与const 放在一起看看:
C),const Stu_pst stu3;
D),Stu_pst const stu4;
大多数初学者认为
C)里const 修饰的是stu3 指向的对象;
D)里const 修饰的是stu4这个指针。
很遗憾,C)里const 修饰的并不是stu3 指向的对象。那const 这时候到底修饰的是什么呢?
我们在讲解const int i 的时候说过const 放在类型名“int”前后都行;而const int*p 与int * const p 则完全不一样。也就是说,我们看const 修饰谁都时候完全可以将数据类型名视而不见,当它不存在。反过来再看“const Stu_pst stu3”,Stu_pst 是“struct student{ /*code*/} *”的别名, “struct student {/*code*/} *”是一个整体。对于编译器来说,只认为Stu_pst 是一个类型名,所以在解析的时候很自然的把“Stu_pst”这个数据类型名忽略掉。
现在知道const 到底修饰的是什么了吧?^_^。
二、typedef int int32;错误
为什么? 答因为用typedef 取的别名不支持这种类型扩展。
三、#define a int[10]与typedef int a[10];