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

时间:2013-11-03 17:51:13

标签: 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?
    SomeTypeRef myTypeRef;
    return 0;
}

从我所知道的,程序的其他部分(比如main)只能传递SomeTypeRef,并且实际上不能使用SomeType结构,是吗?

仅仅通过实验,似乎没有办法在main中使用myTypeRef。这是有道理的,因为该结构的定义是“隐藏的”。我的理解在这里是否正确?

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

感谢您的任何澄清。

2 个答案:

答案 0 :(得分:3)

信息隐藏不足以成为对指针进行typedef的理由,因为你可以直接在main中直接使用struct SomeType *,效果完全相同。

对指针执行此类typedef的更好理由是隐藏它实际上是指针的事实。这为您提供了以下选项,可以将Ref类型更改为不太直接的引用,以便移动已分配的内存块以实现更高效的内存使用。例如,在旧版Windows中这是一件很重要的事情。

大多数现代操作系统使用虚拟内存来隐藏这种复杂性,使得这种类型的dede大多是过去的遗留物。

答案 1 :(得分:1)

是的darren!你是对的。

首先,SomeTyperRef不能从一个函数(如main)中更改,因为你已经在SomeType.h中声明了它。

其次,你的理解是正确的。

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