|
|
1
28
你知道,你不能这样做。然而,也有一些习语可以产生类似的效果。 C将允许您做类似于面向对象设计中的“pimpl”习惯用法的操作。您的结构可以有一个不透明的指针,指向另一个作为该结构的私有数据的前向声明结构。在结构上操作的函数代替成员函数,可以拥有私有成员的完整定义,并可以使用它,而代码的其他部分则不能。例如: 在标题中,foo.h:
在实现中,foo.c:
在程序中:
注意需要使用“构造函数”函数来为私有数据分配内存。很明显,你需要一个特殊的函数来处理私有数据。 或者,如果您希望您的结构没有任何公共字段,您可以将 整个的 struct opaque,只需使头类似于
实际定义是
|
|
|
2
9
C语言中有时使用的概念是
这使用了一个标准技巧,即指向结构的指针可以与指向结构中第一个元素的指针互换。 全部的 你的领域是私有的,这更容易:
要创建一个受保护的区域,您只需定义
那就是要确保
|
|
|
3
2
对于数据字段--只是不要使用它们。你可以做一些技巧,比如给他们一些疯狂的名字来阻止他们的使用,但这不会阻止人们。唯一可行的方法是创建另一个私有结构,该结构由库函数的空指针访问。
对于私有函数——使用文件
|
|
|
4
1
通常按照惯例,私有成员的名称中有一个额外的下划线,或者类似的
另一种常见的技术是将结构公开为不完整类型。例如,在头文件中,您可能有:
在实现中,或库的使用者无法访问的某些内部标头中,您有:
如果希望混合使用私有和公共成员,可以执行与上述相同的操作,但将私有结构指针存储为公共结构指针的成员,并将其保留在库的公共使用者中不完整。 不过,这会引入一些间接性,这可能会影响性能。您也可以使用一些类型双关技巧(通常不可移植,但适用于合理的编译器):
这还假定您不能将这些对象存储在堆栈或静态存储中,也不能在编译时获取大小。 |
|
|
5
0
|
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |