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)

 

http://cprogramminglanguage.net/c-structure.aspx

posted @ 2010-04-03 21:32  donj  阅读(400)  评论(0编辑  收藏  举报