我正在浏览libgphoto2存储库并看到了这个:
struct _PTPObjectHandles {
uint32_t n;
uint32_t *Handler;
};
typedef struct _PTPObjectHandles PTPObjectHandles;
为什么有人想要这样做而不只是调用结构PTPObjectHandles
并省略整个typedef
行?
编辑:我应该注意到代码中永远不再使用_PTPObjectHandles
。
答案 0 :(得分:2)
这样做的最常见原因只是简化键入并开始看起来像“真实数据类型”。
EG,这:
struct _PTPObjectHandles *ptr1;
int something;
struct _PTPObjectHandles *ptr2;
如果将其重写为:
,只需看起来“更酷”PTPObjectHandles *ptr1;
int something;
PTPObjectHandles *ptr2;
这是主要原因。
但是,它还为图书馆开发人员提供了使用它能够在将来重新定义它的能力。我见过将typedef从真实结构改为指向结构的指针(例如,OpenSSL)(例如)。 (当然,这不起作用,但你可以想象一下typedef确实会改变的情况,并且它会起作用。)
那么,你有吗?否。
人们这样做是为了让代码更具可读性吗?是。
请注意,C ++类实际上是在做同样的事情。如果你从一本书中读出一本好的C ++,你会发现它首先从一个结构开始,然后将'struct'一词改为'class'并开始使用直接名称实例化它。
编辑:并且......确保您从下面的@Bathsheba中读取评论并检查C中的正确命名约定。正如他所指出的那样,它应该是带有小写p的_pTPObjectHandles。对于我自己的风格,我避免使用大写的typedef,因为我喜欢我的大写类型是C ++中的真正类,并想知道它们何时只是typedef。但是,再一次,这是一种风格选择。
答案 1 :(得分:1)
部分原因是你可以转发引用内部结构,但在代码的其余部分使用一个有意义的名称,这个:
struct _mylist
{
struct _mylist *next;
/* etc ... */
};
typedef struct _mylist MyList;
请注意,切换顺序会使事情更具可读性,但您仍需要两个声明,因此:
typedef struct _mylist MyList;
struct _mylist
{
MyList *next;
/* etc ... */
};
你不能做的是:
typedef struct { MyList *next; } MyList;
所以你必须有2个声明。
我倾向于使用类似于第一种形式的东西,例如:
typedef struct _mylist
{
struct _mylist *next;
/* etc ... */
} MyList;
因为它很清楚这两种类型是相同的。
答案 2 :(得分:0)
在该行代码之后,您只需使用PTPObjectHandles
即可创建struct。
创建该结构
没有typedef struct _PTPObjectHandles aStruct;
使用typedef:PTPObjectHandles aStruct;
答案 3 :(得分:0)
此模式用于表示“_PTPObjectHandles
是内部(技术)名称,请勿使用它。请改用PTPObjectHandles
。”
通常,在C中,前导下划线表示“这是内部的,消失”。对于没有正确名称空间的语言来说,这是一个廉价的解决方案(注意:我在这里谈的是普通C语言,而不是C ++)。