首页 > 代码库 > 结构体的两种定义方式

结构体的两种定义方式

typedef struct 用法小结

   typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

   typedef与结构体结合使用

typedef struct tagMyStruct
{ 
    int iNum;
    long lLength;
} MyStruct;

这句话实际上完成两个操作:

1、定义一个新的结构类型 tagMyStruct,struct关键字和tagMyStruct一起构成了这个结构类型,不论是否有typedef这个结构都存在。

2、typedef为这个新结构起一个名字MyStruct。

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

   struct在代码中常见的两种形式

struct A 
{ 
    //... 
}; 

struct 
{ 
    //... 
} A; 

前者叫做“结构体类型定义”意思是:定义一个名称是“A”的结构体

后者是结构体变量定义,意思是:定义一个名称是“A”的结构体变量,这里的结构体是匿名结构体,无法被直接引用。

在C和C++中struct和typedef struct的区别

在C和C++中有三种定义结构的方法

typedef struct { 
    int data; 
    int text; 
} S1; 
//这种方法可以在c或者c++中定义一个S1结构

struct S2 { 
    int data; 
    int text; 
}; 
// 这种定义方式只能在C++中使用,而如果用在C中,那么编译器会报错 

struct { 
    int data; 
    int text; 
} S3; 
//这种方法并没有定义一个结构,而是定义了一个s3的结构变量,编译器会为s3内存。 

void main() 
{
    S1 mine1;// OK ,S1 是一个类型 
    S2 mine2;// OK,S2 是一个类型 
    S3 mine3;// OK,S3 不是一个类型 
    S1.data = 5;// ERROR S1 是一个类型 
    S2.data = 5;// ERROR S2 是一个类型 
    S3.data = 5;// OKS3是一个变量 

}

另外,对与在结构中定义结构本身的变量也有几种写法

struct S6 { 
    S6* ptr; 
}; 
// 这种写法只能在C++中使用 

typedef struct { 
    S7* ptr; 
} S7; 
// 这是一种在C和C++中都是错误的定义 

//如果在C中,我们可以使用这样一个“曲线救国的方法“ 
typedef struct tagS8{ 
    tagS8 * ptr; 
} S8;

struct _x1 { ...}x1; 和 typedef struct _x2{ ...} x2; 有什么不同?

其实, 前者是定义了类_x1和_x1的对象实例x1, 后者是定义了类_x2和_x2的类别名x2 。