我正在深入研究第三方代码库,发现将类型声明为指向未定义结构的指针显然是有效的。作为一个最小的工作示例,考虑一个 C 文件test.c
不包含任何内容,但:
typedef struct foo *bar;
令我惊讶的是,使用命令编译该文件没有任何问题
gcc test.c -shared
为什么编译器不会抱怨 struct foo 没有在任何地方声明?
我的环境是带有gcc的Ubuntu 16.04(Ubuntu 5.4.0-6ubuntu1~16.04.5)5.4.0 20160609。
上面的声明创建了一个前向声明 of struct foo
。尽管您无法访问其成员,但可以对指向它的指针进行操作。
这通常被称为不透明型,用于向库的用户隐藏库的实现细节。
例如,库实现可能包含以下内容:
lib.c:
struct foo {
int f1;
};
struct foo *init()
{
return malloc(sizeof(struct foo));
}
void set1(struct foo *p, int val)
{
p->f1 = val;
}
int get1(struct foo *p)
{
return p->f1;
}
void cleanup(struct foo *p)
{
free(p);
}
该库的头文件可能如下所示:
lib.h:
struct foo;
struct foo *init(void);
void set1(struct foo *p, int val);
int get1(struct foo *p);
void cleanup(struct foo *p);
该库的用户将使用init
函数创建结构体的实例set1
and get1
读取/更新成员的功能。然而,用户不能创建一个实例struct foo
或无需通过接口函数之一即可访问成员。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)