[英]Why define a _struct and then typedef it without _?
我正在浏览libgphoto2存储库,并看到了以下内容:
struct _PTPObjectHandles {
uint32_t n;
uint32_t *Handler;
};
typedef struct _PTPObjectHandles PTPObjectHandles;
为什么有人要这样做,而不是仅仅调用struct PTPObjectHandles
并省略整个typedef
行?
编辑:我可能应该注意到_PTPObjectHandles
不再在代码中使用。
这样做的最常见原因只是使它的键入更短,并开始看起来像“真实数据类型”。
EG,这:
struct _PTPObjectHandles *ptr1;
int something;
struct _PTPObjectHandles *ptr2;
如果将其重写为:
PTPObjectHandles *ptr1;
int something;
PTPObjectHandles *ptr2;
那是主要原因。
但是,它还为库开发人员提供了使您使用它的能力,以便将来将其重新定义为其他类型。 我已经看到了一些案例(例如OpenSSL),这些案例将typedef从实际结构更改为指向结构的指针(例如)。 (当然,这是行不通的,但是您可以想象出typedef确实发生了更改并且可以工作的情况。)
所以,你必须吗? 没有。
人们是否会尝试使代码更具可读性? 是。
请注意,C ++类实际上在做同一件事。 如果您从一本书开始读一本优秀的C ++,您会发现它首先是从一个struct开始,然后将“ struct”一词更改为“ class”,并开始使用直接名称实例化它。
编辑:并且...确保您阅读了下面@Bathsheba的注释,并检查了C中的正确命名约定。正如他指出的那样,它应该是_pTPObjectHandles,小写的p。 对于我自己的样式,我避免太简单地使用大写typedef,因为我喜欢大写类型在C ++中成为真正的类,并且想知道它们何时只是typedef。 但这又是一种风格选择。
部分原因是您可以向前引用其内部的结构,还可以在其余代码中使用有意义的名称,这是:
struct _mylist
{
struct _mylist *next;
/* etc ... */
};
typedef struct _mylist MyList;
请注意,切换顺序使事情更具可读性,但是您仍然需要两个声明,因此:
typedef struct _mylist MyList;
struct _mylist
{
MyList *next;
/* etc ... */
};
您不能执行以下操作:
typedef struct { MyList *next; } MyList;
所以你必须有两个声明。
我倾向于使用类似于第一种形式的东西,例如:
typedef struct _mylist
{
struct _mylist *next;
/* etc ... */
} MyList;
因为很清楚,这两种类型的含义是相同的。
在那行代码之后,您可以仅使用PTPObjectHandles
创建结构。 创建那个结构
没有typedef struct _PTPObjectHandles aStruct;
使用typedef: PTPObjectHandles aStruct;
该模式用来表示“ _PTPObjectHandles
是内部(技术上的)名称,请不要使用它。请改用PTPObjectHandles
。”
通常,在C语言中,前导下划线表示“这是内部的,要消失”。 对于没有适当名称空间的语言,这是一种廉价的解决方案(请注意:我在这里谈论的是纯C,而不是C ++)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.