我在浏览 libgphoto2 存储库时看到了这个:
struct _PTPObjectHandles {
uint32_t n;
uint32_t *Handler;
};
typedef struct _PTPObjectHandles PTPObjectHandles;
为什么有人要这样做而不是仅仅调用结构 PTPObjectHandles
并省略整个 typedef
行?
编辑:我应该注意到 _PTPObjectHandles
再也没有在代码中使用过。
最佳答案
这样做的最常见原因只是为了使其更短以键入并开始看起来像“真正的数据类型”。
EG,这个:
struct _PTPObjectHandles *ptr1;
int something;
struct _PTPObjectHandles *ptr2;
如果您将其重写为:
PTPObjectHandles *ptr1;
int something;
PTPObjectHandles *ptr2;
这是主要原因。
但是,它还为库开发人员提供了使您能够在将来将其重新定义为其他内容的能力。我见过将 typedef 从实际结构更改为指向结构的指针(例如)的案例(例如,OpenSSL)。 (诚然,这行不通,但您可以想象 typedef 确实发生变化并且它会起作用的情况。)
所以,你必须这样做吗?没有。
人们这样做是为了让代码更具可读性吗?是的。
请注意,C++ 类实际上在做同样的事情。如果您从头开始阅读一本优秀的 C++ 类书籍,您会发现它首先从结构开始,然后将“结构”一词更改为“类”,并开始使用直接名称对其进行实例化。
编辑: 并且...请务必阅读下面@Bathsheba 的评论并检查 C 中的正确命名约定。正如他指出的那样,它应该是带有小写 p 的 _pTPObjectHandles。对于我自己的风格,我避免过于简单地使用大写 typedef,因为我喜欢我的大写类型是 C++ 中的真正类,并且想知道它们什么时候只是 typedef。但是,这又是一种风格选择。
关于c - 为什么定义一个 _struct 然后在没有 _ 的情况下对其进行类型定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22787518/