我有一个标头和一个使用此标头的示例应用程序,全部用 C 语言编写,除此之外,我得到了该软件的几乎所有逻辑;这是标题的有趣部分:
struct A;
typedef struct A A;
在 C 应用程序中,这A
仅在声明这样的指针时使用
A* aName;
我很确定这是一个只包含A
在范围/命名空间中的解决方案,并且只给一个基本上是 void 的指针命名,因为这种指针只用于处理某种数据,它更像是一些命名空间糖。
这可能是为了什么?
你是对的,它就像一个 void 指针,因为它void
是一个不完整的类型,并且在这个文件A
中也是一个不完整的类型。对于不完整类型,您所能做的就是传递指向它们的指针。
void*
与此文件相比,它有一个优势,即它是一种不同且不兼容的类型,与使用B
. 所以你得到了一点类型安全。如果A
iswindowHandle
和B
is jpgHandle
,那么您不能将错误的传递给函数。
与定义接受一个函数void*
的文件相比,它有一个优势——该文件可以包含 的定义,并给出它想要的任何成员,第一个文件不需要知道。.c
A*
struct A
A
但是,您说A
在任何头文件中都没有提到其他内容,这意味着没有接受或返回它的函数。您还说,A
源文件中的唯一用途是声明指针——我想知道这些指针的值来自哪里,如果有的话。
如果如果有人定义了一个未初始化的A*
并且从不使用它,那么这一切都发生了,那么显然这是一些旧代码的残余,或者是一些从未编写过的代码的开始,它根本不应该在文件中。
最后,如果真正的类型被称为比 不那么愚蠢的东西A
,那么这个名字可能会为它的使用提供线索。
我假设struct A
是一个前向声明。它很可能是在其中一个文件中定义的.c
。
这样做struct A
的成员对于定义它的模块是私有的。
这是一个不透明指针的示例,它对于传递句柄很有用。有关更多信息,请参阅http://en.wikipedia.org/wiki/Opaque_pointer 。从 C++ 的角度来看,这里可能有趣的是,您可以使用一个成员定义一个类,该成员是一个(至今)未定义的指针struct
。虽然这struct
还没有在头文件中定义,但在后来的一些 cpp 实现中,这struct
是给定的主体,编译器会完成其余的工作。这种策略也称为 Pimpl 成语(您可以在 Internet 上找到更多内容)。Microsoft 在http://msdn.microsoft.com/en-us/library/hh438477.aspx简要讨论了它。