为什么在 C 中将类型定义为指向未定义结构的指针是有效的?

2024-03-09

我正在深入研究第三方代码库,发现将类型声明为指向未定义结构的指针显然是有效的。作为一个最小的工作示例,考虑一个 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(使用前将#替换为@)

为什么在 C 中将类型定义为指向未定义结构的指针是有效的? 的相关文章