gpt4 book ai didi

c - C 中的不透明(抽象)数据类型

转载 作者:太空宇宙 更新时间:2023-11-04 05:22:07 24 4
gpt4 key购买 nike

文件api.h

#include <stdio.h>
#ifndef API
#define API

struct trytag;
typedef struct trytag try;

void trial (try *);

#endif

文件core.h

#ifndef CORE
#define CORE
struct trytag
{
int a;
int b;
};
#endif

文件func.c

#include "api.h"
#include "core.h"

void trial (try *tryvar)
{
tryvar->a = 1;
tryvar->b = 2;
}

文件main.c

#include "api.h"

int main ()
{
try s_tryvar;

trial(&s_tryvar);

printf("a = %d\nb = %d\n", s_tryvar.a, s_tryvar.b);
}

当我编译时,我得到:

main.c:5: error: storage size of ‘s_tryvar’ isn’t known

如果我在 main.c 中包含 core.h,则不会出现此错误,因为 try 已在 core.h 中定义。但我希望结构 try 隐藏到 main.c — 它不应该知道 try 结构的成员。我错过了什么?

最佳答案

我认为您尝试做的事情是不可能的。编译器需要知道try 结构有多大才能编译main.c。如果你真的想让它不透明,做一个通用的指针类型,而不是直接在 main() 中声明变量,做 alloc_try()free_try () 函数来处理创建和删除。

像这样:

API.h:

#ifndef API
#define API

struct trytag;
typedef struct trytag try;

try *alloc_try(void);
void free_try(try *);
int try_a(try *);
int try_b(try *);
void trial (try *);

#endif

核心.h:

#ifndef CORE
#define CORE
struct trytag
{
int a;
int b;
};
#endif

函数.c:

#include "api.h"
#include "core.h"
#include <stdlib.h>

try *alloc_try(void)
{
return malloc(sizeof(struct trytag));
}

void free_try(try *t)
{
free(t);
}

int try_a(try *t)
{
return t->a;
}

int try_b(try *t)
{
return t->b;
}

void trial(try *t)
{
t->a = 1;
t->b = 2;
}

主.c:

#include <stdio.h>
#include "api.h"

int main()
{
try *s_tryvar = alloc_try();

trial(s_tryvar);
printf("a = %d\nb = %d\n", try_a(s_tryvar), try_b(s_tryvar));

free_try(s_tryvar);
}

关于c - C 中的不透明(抽象)数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2001637/

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