0%

typedef struct和struct

typedef struct和struct的区别和用法,写作备忘.

C语言中:

在C中定义一个结构体类型要用typedef:

1
2
3
4
5
typedef struct Student
{
GObjectClass parent_class;
DBusGConnection *connection;
} CalcServerClass;

于是在声明变量时就可以:

1
CalcServerClass *klass;

如果没有typedef就必须使用“struct Student klass1;”来声明,CalcServerClass就成了struct Student的另一个名字。

同样,这里可以不加 Student

1
2
3
4
5
typedef struct
{
GObjectClass parent_class;
DBusGConnection *connection;
} CalcServerClass;

这样改变之后,声明时不能再用“struct Student klass1;”,必须是“CalcServerClass klass1; ”。

C++中:

C++中想要实现上述同种效果,只需:

1
2
3
4
5
struct Student
{
GObjectClass parent_class;
DBusGConnection *connection;
}

定义了结构体类型Student,声明变量时直接 “*Student klass2;”

如果要在C++中使用typedef的话,与在C中有一些区别:

1
2
3
4
struct   Student  
   {
    int a;
   }stu1; //stu1是一个变量

使用时可以直接访问 stu1.a

1
2
3
4
typedef   struct   Student2  
   {
    int a;
   }stu2; //stu2是一个结构体类型=struct Student

stu2则必须先“*stu s2;”,然后才能“s2.a=10;*”

总结

typedef struct 和struct的实质:

1
2
3
4
typedef   struct   tagMyStruct 
   {
    int a;
   }Mystruct;

tagMystruct是标识符,MyStruct是变量类型(相当于 intchar等一样)。

这一语句实际上完成了两个操作:

  1. 定义一个新的结构类型

    1
    2
    3
    4
    struct   tagMyStruct 
       {
        int a;
       };

    tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,不论typedef struct是否和tagMyStruct放在一起,这个结构都存在。

    可以使用struct tagMyStruct Name1来定义变量,但 tagMyStruct Name1来定义变量是错误的,因为structtagMyStruct放在一起才能表示一个结构类型。

  2. typedef为这个新的结构起了一个新的名字,叫Mystruct。

    1
    typedef struct tagMyStruct MyStruct;

    因此,Mystruct在实际上相当于struct tagMyStruct,我们可以使用MyStruct varName定义变量。

C和C++在使用上的区别

1
2
3
4
typedef   struct   tagMyStruct 
   {
    int a;
   }Mystruct;

在C中,这个申明后申请结构变量的方法有两种:

​ (1)struct tagMyStruct 变量名

​ (2)MyStruct 变量名

在C++中,使用方法如下:

​ (1)struct tagMyStruct 变量名

​ (2)MyStruct 变量名

​ (3)tagMyStruct 变量名

两种颜色的功德箱(逃