当试图在一些开源C项目的代码中发现某些东西时,我经常会看到这种typedef:
typedef struct _StructA StructA;
typedef struct _LinusTorvalds LinusTorvalds;
为什么不直接定义和使用StructA,只需要StructA,而不是定义_ StructA 然后“typedef”呢? 这种“_”技术有什么意义?
答案 0 :(得分:7)
在C中,结构必须用作:
struct _StructA my_variable;
...即,您不仅要在定义struct
时键入struct
,还要在每次使用时键入typedef
。 struct
在您使用它时会消除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;
现在,您可以将该类型称为StructA
或struct 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
,则只需更改一行,而不是数百行。