我是C编程的初学者,但我想知道在定义结构时使用typedef与不使用typedef之间有什么区别。在我看来,这两者并没有什么区别,它们实现的目标是一样的。

struct myStruct{
    int one;
    int two;
};

vs.

typedef struct{
    int one;
    int two;
}myStruct;

当前回答

不能对typedef结构使用前向声明。

该结构本身是匿名类型,因此没有实际的名称来转发声明。

typedef struct{
    int one;
    int two;
} myStruct;

像这样的前向声明是行不通的:

struct myStruct; //forward declaration fails

void blah(myStruct* pStruct);

//error C2371: 'myStruct' : redefinition; different basic types

其他回答

如果使用struct而不使用typedef,则总是需要编写

struct mystruct myvar;

写字是违法的

mystruct myvar;

如果使用typedef,就不再需要结构体前缀了。

在C语言中,结构、联合和枚举的类型说明关键字是强制性的,也就是说,当引用类型时,你总是必须在类型名(它的标记)前面加上struct、联合或enum。

您可以通过使用typedef来摆脱关键字,这是一种信息隐藏的形式,因为在声明对象时,对象的实际类型将不再可见。

因此建议(参见Linux内核编码风格指南,第5章)只在以下情况下这样做 实际上,您希望隐藏这些信息,而不仅仅是为了节省一些按键。

你应该使用typedef的一个例子是不透明类型,它只与相应的访问器函数/宏一起使用。

不同之处在于使用结构体时。

第一种方法是:

struct myStruct aName;

第二种方法允许您删除关键字struct。

myStruct aName;

在C(不是c++)中,你必须像这样声明结构变量:

struct myStruct myVariable;

为了能够使用myStruct myVariable;相反,你可以对结构进行类型定义:

typedef struct myStruct someStruct;
someStruct myVariable;

你可以将结构定义和类型定义结合在一个声明匿名结构和类型定义的语句中。

typedef struct { ... } myStruct;

不能对typedef结构使用前向声明。

该结构本身是匿名类型,因此没有实际的名称来转发声明。

typedef struct{
    int one;
    int two;
} myStruct;

像这样的前向声明是行不通的:

struct myStruct; //forward declaration fails

void blah(myStruct* pStruct);

//error C2371: 'myStruct' : redefinition; different basic types