3

我有一个标头和一个使用此标头的示例应用程序,全部用 C 语言编写,除此之外,我得到了该软件的几乎所有逻辑;这是标题的有趣部分:

struct A;
typedef struct A A;

在 C 应用程序中,这A仅在声明这样的指针时使用

A* aName;

我很确定这是一个只包含A在范围/命名空间中的解决方案,并且只给一个基本上是 void 的指针命名,因为这种指针只用于处理某种数据,它更像是一些命名空间糖。

这可能是为了什么?

4

3 回答 3

4

你是对的,它就像一个 void 指针,因为它void是一个不完整的类型,并且在这个文件A中也是一个不完整的类型。对于不完整类型,您所能做的就是传递指向它们的指针。

void*与此文件相比,它有一个优势,即它是一种不同且不兼容的类型,与使用B. 所以你得到了一点类型安全。如果AiswindowHandleBis jpgHandle,那么您不能将错误的传递给函数。

与定义接受一个函数void*的文件相比,它有一个优势——该文件可以包含 的定义,并给出它想要的任何成员,第一个文件不需要知道。.cA*struct AA

但是,您说A在任何头文件中都没有提到其他内容,这意味着没有接受或返回它的函数。您还说,A源文件中的唯一用途是声明指针——我想知道这些指针的值来自哪里,如果有的话。

如果如果有人定义了一个未初始化的A*并且从不使用它,那么这一切都发生了,那么显然这是一些旧代码的残余,或者是一些从未编写过的代码的开始,它根本不应该在文件中。

最后,如果真正的类型被称为比 不那么愚蠢的东西A,那么这个名字可能会为它的使用提供线索。

于 2012-09-19T17:55:10.997 回答
2

我假设struct A是一个前向声明。它很可能是在其中一个文件中定义的.c

这样做struct A的成员对于定义它的模块是私有的。

于 2012-09-19T16:53:07.263 回答
1

这是一个不透明指针的示例,它对于传递句柄很有用。有关更多信息,请参阅http://en.wikipedia.org/wiki/Opaque_pointer 。从 C++ 的角度来看,这里可能有趣的是,您可以使用一个成员定义一个类,该成员是一个(至今)未定义的指针struct。虽然这struct还没有在头文件中定义,但在后来的一些 cpp 实现中,这struct是给定的主体,编译器会完成其余的工作。这种策略也称为 Pimpl 成语(您可以在 Internet 上找到更多内容)。Microsoft 在http://msdn.microsoft.com/en-us/library/hh438477.aspx简要讨论了它。

于 2013-08-08T09:32:18.943 回答