gpt4 book ai didi

在函数中作为结构体传递并返回后创建 C 库

转载 作者:行者123 更新时间:2023-11-30 15:04:18 26 4
gpt4 key购买 nike

是否可以创建一个 function.c 库,在函数中,我可以传递和返回结构体(在同一个 function.c 文件中定义)?或者我需要为 struct 创建一个单独的库吗?

最佳答案

正如其他人在评论中提到的,有几种方法:

将结构定义放在头文件中

lib.h

struct data {
...
}
void write_data(struct data *write);
void read_data(struct data *read);

lib.c

void write_data(struct data *write)
{
...
}

void read_data(struct data *read)
{
...
}

用户.c

#include "lib.h"

void user(void)
{
struct data something;
read_data(&something);
write_data(&something);
}

此方法可能是最常见的方法之一,您可以在头文件中定义结构,该头文件由库的用户包含。

向用户提供不透明的界面

lib.h

#define STRUCT_SIZE 100
void write_data(void *write);
void read_data(void *read);

lib.c

struct data {
...
}

void write_data(void *write)
{
struct data *write_struct;
write_struct = (struct data *)write;
...
}

void read_data(void *read)
{
struct data *read_struct;
read_struct = (struct data *)read;
...
}

用户.c

#include "lib.h"

void user(void)
{
void *something;
something = malloc(STRUCT_SIZE);
read_data(something);
write_data(something);
}

这不像第一个选项那么常见,但仍然时不时地使用。一般来说,这在库头中定义为“外部”或“不透明”结构(而不​​是定义原始大小)。在 lib.c 内部,定义了结构的“内部”版本,这使得用户更难以使用底层数据结构。

盲目信仰(不推荐)

lib.h

void write_data(void *write);
void read_data(void *read);

lib.c

struct data {
...
}

void write_data(void *write)
{
struct data *write_struct;
write_struct = (struct data *)write;
...
}

void read_data(void *read)
{
struct data *read_struct;
read_struct = (struct data *)read;
...
}

用户.c

#include "lib.h"

// copy struct definition from lib.c.
// struct could keep the name 'data', but is renamed here to illustrate a point
// this is very dangerous and not recommended, as both structs must agree or things may not work
struct better_data {
...
}

void user(void)
{
struct better_data something;
read_data((void *)&something);
write_data((void *)&something);
}

我不会在任何情况下使用此方法,但我将其包含在内是为了说明目的。这只是表明结构体没有什么特别的,它们只是内存。如果两个人就如何解释这 block 内存达成一致,事情就会顺利进行。将结构体定义放在头文件中的目的是为了方便人们共享如何解释内存。

关于在函数中作为结构体传递并返回后创建 C 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40332090/

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