2

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

SomeType.h:

typedef struct SomeType *SomeTypeRef;

SomeType.m:

struct SomeType
{
    int a;
    int b;
};

主文件

#import "SomeType.h"

int main(int argc, const char * argv[])
{
    // What can i do with you?
    SomeTypeRef myTypeRef;
    return 0;
}

所以据我所知,程序的其他部分(比如这里的 main)只能绕过 SomeTypeRef,实际上不能使用 SomeType 结构,是吗?

仅通过一些试验,似乎没有办法在 main.xml 中尊重 myTypeRef。这是有道理的,因为该结构的定义是“隐藏的”。我的理解在这里正确吗?

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

感谢您的任何澄清。

4

2 回答 2

3

信息隐藏不是 typedef 指向指针的充分理由,因为您可以简单地在 main 中直接使用 struct SomeType* 以获得完全相同的效果。

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

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

于 2013-11-03T18:01:13.127 回答
1

是的,达伦!你是绝对正确的。

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

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

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

于 2013-11-03T18:03:32.997 回答