只是不明白这些typedef的意义

时间:2012-01-26 07:40:56

标签: c typedef

当试图在一些开源C项目的代码中发现某些东西时,我经常会看到这种typedef:

typedef struct _StructA StructA;
typedef struct _LinusTorvalds LinusTorvalds;

为什么不直接定义和使用StructA,只需要StructA,而不是定义_ StructA 然后“typedef”呢? 这种“_”技术有什么意义?

4 个答案:

答案 0 :(得分:7)

在C中,结构必须用作:

struct _StructA my_variable;

...即,您不仅要在定义struct时键入struct,还要在每次使用时键入typedefstruct在您使用它时会消除typedef的输入(但在您定义时不会这样做:没有办法消除它)。使用struct,声明StructA my_variable; 的实例变为:

_StructA

现在,在StructA / struct的定义中,这并没有完全解释typedef / typedef struct { ... } StructA; 业务,因为您可以这样做:< / p>

struct

...在这里,我们采用匿名typedef并立即将其反馈给struct。但是使用这种方法,你不能在其内部使用typedef struct _Foo { int data; struct _Foo *next; } Foo; ,因为它还没有(还)有一个名字。为此,你需要这样的东西:

{{1}}

答案 1 :(得分:3)

在C中,定义结构类型时:

struct StructA {
    int foo;
    double bar;
};

类型的名称为struct StructA,而不仅仅是StructA。 (C ++允许您将类型称为StructA; C ++是另一种语言。

如果您坚持使用单字名称,则可以使用typedef(我们应该注意,它为现有类型创建新名称,而不是新类型):

typedef struct StructA StructA;

现在,您可以将该类型称为StructAstruct StructA

这些可以组合成一个声明:

typedef struct StructA {
    int foo;
    double bar;
} StructA;

请注意,我对struct标签和typedef使用了相同的标识符。由于它们位于不同的名称空间中,因此完全有效。

另一方面,我自己的偏好是完全省略typedef,只需将类型称为struct StructA

顺便提一下,问题中的_StructA_LinusTorvalds名称是保留给实现的,不应在您自己的代码中使用。通常,应避免使用以下划线开头的标识符。 (使用这样的标识符并不罕见,但这是错误的,除非代码是C实现本身的一部分。)

总结一下:只有当你想为这个类型设置一个单词的名字时才需要typedef(这不是真的需要) - 如果你确实使用了typedef,那么就没有理由使用不同的标识符对于typedef和struct标签。

答案 2 :(得分:1)

每次声明结构的变量时,它都提供了不使用struct关键字的便利。

没有typedef:

struct _StructA obj;

使用typedef:

StructA obj;

答案 3 :(得分:0)

它可以减少对某个数据结构的依赖性。例如。如果您想使用StructB(可能包含更多字段)而不是StructA,则只需更改一行,而不是数百行。