为什么要定义一个_struct然后在没有_的情况下输入它?

时间:2014-04-01 13:33:26

标签: c struct typedef libgphoto2

我正在浏览libgphoto2存储库并看到了这个:

struct _PTPObjectHandles {
    uint32_t n;
    uint32_t *Handler;
};
typedef struct _PTPObjectHandles PTPObjectHandles;

为什么有人想要这样做而不只是调用结构PTPObjectHandles并省略整个typedef行?

编辑:我应该注意到代码中永远不再使用_PTPObjectHandles

4 个答案:

答案 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 ++)。