gpt4 book ai didi

c - 在 C 中抽象类型实现

转载 作者:太空宇宙 更新时间:2023-11-04 00:43:49 25 4
gpt4 key购买 nike

我是 C 编程的新手,正在尝试编写一个简单的示例。确切地说,我试图抽象出一个类型实现,并简单地使用 typedef 并指定我可以对该类型执行的操作。我知道那时类型不完整,但我打算将其完成到 c 文件中,而不是 header 。这是它:

test.h

#ifndef _TEST_H
#define _TEST_H

typedef my_type_t;

void init(my_type_t **t);

#endif //_TEST_H

test.c

#include <stdlib.h>
#include "test.h"
// implementation details
struct my_type_t{ //<---- completening my_type_t to be a struct with 1 field
int field;
};

void init(struct my_type_t **t){ //<--- error: conflicting type for init
*t = malloc(sizeof(struct my_type_t));
(*t) -> field = 42;
}

这样的事情可能吗?我希望实现完全隐藏有关实际类型定义的所有细节,只公开可以用它完成的操作。

UPD:如果我们重写 c 文件如下:

#include <stdlib.h>
#include "test.h"

struct internal_my_type_definition_t{
int field;
};

void init(my_type_t **t){
struct internal_my_type_definition_t *st = malloc(sizeof(struct internal_my_type_definition_t));
st -> field = 42;
*t = st;
}

这样的实现有什么问题吗?

最佳答案

在你的标题中,改变

typedef my_type_t;

struct my_type_t;

这是一个很常见的模式。请记住,您需要一个函数来在堆上分配结构并释放它;您隐藏的信息之一是结构的大小,因此 API 使用者实际上只能处理指向结构的指针,而不是结构本身。

惯用的 API 应该是这样的

struct my_type_t* my_type_new(void);
void my_type_free(struct my_type_t* self);

my_type_init 通常用于初始化一个已经分配的实例,这实际上只有在您想在子类型的 *_new 函数中链接到它时才有用.

编辑:为了回答您的后续问题,您可以想象在标题中做这样的事情:

#if !defined(MY_TYPE_NS)
# define MY_TYPE_NS struct
#endif

typedef MY_TYPE_NS my_type_t my_type;

my_type* my_type_new(void);

/* ... */

然后,在您的 *.c 文件中:

#define MY_TYPE_NS union
#include "test.h"

union my_type_t {
/* ... */
};

my_type* my_type_new(void*) {
my_type* res = malloc(sizeof(my_type));
res->field = 42;
return res;
}

我觉得这只是轻微的邪恶。我可能只使用嵌套在结构内部的 union 来避免代码中出现任何意外。

关于c - 在 C 中抽象类型实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53475406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com