此C模式是否仅用于隐藏实现细节?

此C模式是否仅用于隐藏实现细节?,c,pointers,struct,typedef,C,Pointers,Struct,Typedef,这对于C爱好者来说可能是基本的,但我对我在一些C项目中看到的以下模式有一两个问题: SomeType.h: typedef struct SomeType *SomeTypeRef; SomeType.m: struct SomeType { int a; int b; }; main.m #import "SomeType.h" int main(int argc, const char * argv[]) { // What can i do with you?

这对于C爱好者来说可能是基本的,但我对我在一些C项目中看到的以下模式有一两个问题:

SomeType.h:

typedef struct SomeType *SomeTypeRef;
SomeType.m:

struct SomeType
{
    int a;
    int b;
};
main.m

#import "SomeType.h"

int main(int argc, const char * argv[])
{
    // What can i do with you?
    SomeTypeRef myTypeRef;
    return 0;
}
所以从我所知道的,程序的其他部分(比如这里的main)只能传递SomeTypeRef,实际上不能使用SomeType结构,是吗

仅仅从一点实验来看,似乎根本没有办法遵从myTypeRef。这是有意义的,因为该结构的定义是“隐藏的”。我的理解正确吗

最后,为什么编译器在SomeType.h中看到typedef时会感到高兴?它不知道它要定义的结构,但我想这并不重要


感谢您的澄清。

信息隐藏并不是将def键入指针的充分理由,因为您可以直接在main中使用struct SomeType*,效果完全相同

对指针执行此类typedef的一个更好的原因是隐藏它实际上是指针的事实。这使您可以在以后选择将Ref类型更改为不太直接的引用,以便移动分配的内存块以更高效地使用内存。例如,在旧版本的Windows中,这是一件重要的事情


不过,大多数现代操作系统都使用虚拟内存来隐藏这种排序的复杂性,这使得这样的typedef基本上是过去的遗物。

信息隐藏并不是将typedef指向指针的充分理由,因为您只需在main中直接使用struct SomeType*,效果完全相同

对指针执行此类typedef的一个更好的原因是隐藏它实际上是指针的事实。这使您可以在以后选择将Ref类型更改为不太直接的引用,以便移动分配的内存块以更高效地使用内存。例如,在旧版本的Windows中,这是一件重要的事情


不过,大多数现代操作系统都使用虚拟内存来隐藏这种排序复杂性,这使得这样的typedef基本上是过去的遗物。

是的,达伦!你完全正确

首先,SomeTyperRef不能从函数(比如main)中更改,因为您已经在SomeType.hfie中声明了它

第二,你的轻描淡写是正确的


有一种更“优雅”的方式来隐藏信息,使用不透明的指针,但是你必须非常小心!你可以在网站上看到一个很好的例子

是的,达伦!你完全正确

首先,SomeTyperRef不能从函数(比如main)中更改,因为您已经在SomeType.hfie中声明了它

第二,你的轻描淡写是正确的


有一种更“优雅”的方式来隐藏信息,使用不透明的指针,但是你必须非常小心!你可以在网站上看到一个很好的例子

差不多,是的。您可以在不引入中断更改的情况下交换实现。但要小心这一点;只在必要的时候做。请看:谢谢你的维基链接;这很好地解释了这一点。为什么要小心这个呢?陷阱是什么?因为隐藏指针类型在许多情况下会使代码更难使用/理解。我喜欢莱纳斯的观点:差不多,是的。您可以在不引入中断更改的情况下交换实现。但要小心这一点;只在必要的时候做。请看:谢谢你的维基链接;这很好地解释了这一点。为什么要小心这个呢?陷阱是什么?因为隐藏指针类型在许多情况下会使代码更难使用/理解。我喜欢莱纳斯对它的看法: