typedef 指针是个好主意吗?

新手上路,请多包涵

我查看了一些代码并注意到约定是将指针类型转换为

SomeStruct*

进入

typedef SomeStruct* pSomeStruct;

这有什么优点吗?

原文由 Unknown 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 464
2 个回答

当指针本身可以被视为“黑匣子”时,这可能是合适的,即其内部表示应该与代码无关的一段数据。

本质上,如果您的代码 永远不会 取消引用指针,而您只是将它传递给 API 函数(有时通过引用),那么 typedef 不仅会减少代码中 * 的数量,而且还建议对程序员来说,指针不应该被真正干预。

如果需要,这也使得将来更改 API 变得更容易。例如,如果您更改为使用 ID 而不是指针(反之亦然),现有代码不会中断,因为从一开始就不应该取消引用指针。

原文由 Artelius 发布,翻译遵循 CC BY-SA 4.0 许可协议

一般来说,没有。在特定情况下,是的。

有一些其他答案暗示了一些结构,那就是 指针类型。我想到了几个仅指针类型的构造。如果有人想到更多,我会将它们添加到列表中。

不透明类型

这些类型的实现对用户完全隐藏。您通常会在标头中看到一个结构 typedef,但没有该结构的实现。因此,您不能取消引用这些类型的值。对这种类型进行操作的所有函数都采用指向这些类型的指针。在这些情况下添加指向 typedef 的指针是合适的。您经常会看到这些称为“句柄”的类型。

 typedef struct handle_ * handle;

handle get_handle(string s);
void mutate_handle(handle h, value v);
void release_handle(handle h);

灵活的数组成员类型

另一种仅指针类型是使用灵活数组成员 (FAM) 定义的类型。 FAM 类型中的最后一个成员是不受约束的数组。您打算为这些类型动态分配存储空间,并且灵活数组被视为与结构内联。您可以访问 FAM 类型中的字段,但不能取消引用整个对象。在这里添加指向 typedef 的指针也是合适的。

 typedef struct string {
    size_t capacity;
    size_t length;
    char buffer[];
} * string;

string string_new(void);
size_t string_length(string s);
void string_append(string * s, char c);
void string_delete(string * s);

原文由 ktb 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏