在函数中传递和返回结构后创建C库

时间:2016-10-30 18:14:25

标签: c function struct shared-libraries user-defined-data-types

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

1 个答案:

答案 0 :(得分:0)

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

将结构定义放在头文件

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)
{
  ...
}

user.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;
  ...
}

user.c的

#include "lib.h"

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

这并不像第一个选项那么常见,但仍不时使用。通常,这被定义为"外部"或"不透明"库头中的struct(而不是定义原始大小)。在lib.c里面,有一个"内部"定义了struct的版本,这使得用户更难以使用底层数据结构。

盲目信仰(不推荐)

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;
  ...
}

user.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);
}

我不会在任何情况下使用此方法,但我将其包括在内以用于说明目的。这只是表明结构没有什么特别之处,它们只是记忆。如果两个人就如何解释大块的记忆达成一致,那么事情就会起作用。将结构定义放在头文件中的目的是让人们可以轻松地分享如何解释内存。