在浏览libgphoto2存储库时,我看到了以下内容:
struct _PTPObjectHandles {
uint32_t n;
uint32_t *Handler;
};
typedef struct _PTPObjectHandles PTPObjectHandles;为什么有人要这样做,而不只是调用结构PTPObjectHandles和省略整个typedef行?
编辑:我可能应该注意到,代码中再也没有使用_PTPObjectHandles。
发布于 2014-04-01 13:40:58
这样做最常见的原因只是为了缩短输入时间,使其看起来像“真正的数据类型”。
这个例子:
struct _PTPObjectHandles *ptr1;
int something;
struct _PTPObjectHandles *ptr2;如果您将其改写为:
PTPObjectHandles *ptr1;
int something;
PTPObjectHandles *ptr2;这是主要原因。
但是,它还提供了一个库开发人员,它使您能够在将来将它重新定义为其他东西。我已经看到过一些情况(例如,OpenSSL),这些案例将ty清晰度从真正的结构更改为指向结构的指针(例如)。(当然,这不起作用,但您可以想象一下这样的情况,即类型胡枝子实际上是会改变的,而且它会工作。)
所以你必须这么做吗?不是的。
人们这么做是为了让代码更具可读性吗?是。
注意,C++类实际上是在做相同的事情。如果您从底层阅读一本好的C++,您会发现它首先从一个结构开始,然后将' struct‘单词更改为'class’,然后开始使用直名实例化它。
编辑:和。请务必阅读下面@Bathsheba的注释,并检查C中的适当命名约定。如他所指出的,它应该是带有小写p的_pTPObjectHandles。对于我自己的风格,我避免使用大写字体太简单,因为我喜欢我的大写类型在C++中是真类,并且想知道它们什么时候才是类型。但是,同样,这是一个风格的选择。
发布于 2014-04-01 13:55:37
在一定程度上,您可以转发内部结构的引用,但也可以在代码的其余部分使用有意义的名称,如下所示:
struct _mylist
{
struct _mylist *next;
/* etc ... */
};
typedef struct _mylist MyList;请注意,切换order循环会使事情变得更加可读性,但是您仍然需要这两个声明,因此:
typedef struct _mylist MyList;
struct _mylist
{
MyList *next;
/* etc ... */
};你不能做的是:
typedef struct { MyList *next; } MyList;所以你必须有这两个声明。
我倾向于使用类似于第一种形式的东西,如下所示:
typedef struct _mylist
{
struct _mylist *next;
/* etc ... */
} MyList;很明显,这两种类型的含义是相同的。
发布于 2014-04-01 13:43:22
在这一行代码之后,只需使用PTPObjectHandles即可创建struct。创建这个结构
无类型胡枝子struct _PTPObjectHandles aStruct;
与ty胡枝子f:PTPObjectHandles aStruct;
https://stackoverflow.com/questions/22787518
复制相似问题