这对于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的结构一无所知,但我想这并不重要?
感谢您的任何澄清。
答案 0 :(得分:3)
信息隐藏不足以成为对指针进行typedef的理由,因为你可以直接在main中直接使用struct SomeType *,效果完全相同。
对指针执行此类typedef的更好理由是隐藏它实际上是指针的事实。这为您提供了以下选项,可以将Ref类型更改为不太直接的引用,以便移动已分配的内存块以实现更高效的内存使用。例如,在旧版Windows中这是一件很重要的事情。
大多数现代操作系统使用虚拟内存来隐藏这种复杂性,使得这种类型的dede大多是过去的遗留物。
答案 1 :(得分:1)
是的darren!你是对的。
首先,SomeTyperRef不能从一个函数(如main)中更改,因为你已经在SomeType.h中声明了它。
其次,你的理解是正确的。
使用不透明指针隐藏信息有一种更“优雅”的方式,但你必须非常小心!你可以在stackoverflow看到一个很好的例子!