繁体   English   中英

为什么要定义一个_struct然后不使用_对其进行类型定义?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM