struct 以及typedef的陈年旧账
struct结构体是c语言中提出来的,目的是为了方便的访问逻辑上有关联的数据。在c语言中,struct是被当作一种用户自定义的数据类型,我们知道c是面向过程的,因此这个struct还没被提升到一般的类型的这个概念,
如下是定义一个结构体
struct
address{
unsigned
int
house_number;
char
street_name[50];
int
zip_code;
char
country[50];
};
这里并没有声明这个结构体的一个实例(instance),如下定义结构体的实例。
struct
struct_name {
structure_member;
...
} instance_1,instance_2 instance_n;
以及
struct struct_name instance_1,instance_2 instance_n;
其实也可以这么定义一个类的对象 class T t; 所以前面要加struct应该只是c编译器的一种约定。g++编译就无需struct
下面是常见的定义方法
typedef
struct
{
unsigned
int
house_number;
char
street_name[50];
int
zip_code;
char
country[50];
} address;
你看,struct连name都省略了,当然加上也可以 ,这就和struct无关了,这是因为typedef可以在类型定义的时候使用,class也能这么用
typedef class{
public:
int a;
} A;
这就是为上面定义的class 取个别名叫A。
typedef int ar[15], arr[9][6];上面这也就好理解了,上面定义了一个int型的数组, 名字就叫ar,后面是个二维的名字叫arr。这其实也是在定义的时候就取别名,这里有点奇怪,也是容易让人糊涂的地方,因为简单的typedef的使用和define类似,让人会混淆,但typedef显然是注重语义的,
我们反推试试,typedef是用来为一个类型取别名的,上面两个一个是匿名类,一个是匿名结构体,既然是允许为匿名的类型取别名,那只有在类型定义的时候使用typedef,此外还有已有的类型名取别名。我所纳闷的是为什么typedef int ar[15],别名是ar,
int ar[15]如果出现在一般的函数内部或者前面没有typedef的时候,是一个变量的定义式,恩,如果把它当作变量的定义式就错了,应该把它当成一个类型的声明,而如果你要是想这么干typedef int ar[15] b,不好意思 怎么看int ar[15]这里都是定义了一个变量,非法的,我靠,那怎么整,恩 从编译器角度考虑,int ar[15] 有个名字,ar,有个类型 15个元素的一维数组,好吧 如果把ar当作别名的话,那类型就是int [15],这样就解释的通了。
总之 typedef的使用 除了可以对 已知的名字取别名,还可以对匿名的类型取别名,后者需要在类型定义的时候使用。
还有个要提下,struct类型在编译的时候会做优化,pad成4的倍数个字节(32-bit)