gpt4 book ai didi

c - 静态库结构和包含

转载 作者:行者123 更新时间:2023-12-04 15:46:58 28 4
gpt4 key购买 nike

我正在构建一个静态嵌入式 C 库,它有一个 API 头文件,其中列出了所有可用的函数。我不确定有几件事,我想在开始实现之前先澄清一下。

首先,因为这是一个用于嵌入式系统的 C 库,它有硬件 FPU,我不确定我应该包括什么来计算像 sinf() 等数学函数。通常我使用硬件特定的包括,但这在这个静态 C 库中是不可行的,因为它可以在某些 STM32 甚至某些 AVR 等上运行。我该如何解决这个问题?

进一步假设我有文件 foo.c 和 foo.h,它们在库中提供了一些隐藏函数,然后是 api.h,用户可以看到它,还有 api.c,它也是隐。在 foo.h 中现在定义了一些结构,我想在回调中返回给用户。由于这个结构是隐藏的,我不确定我应该如何处理这个回调。我应该在 api.c 中实现一个处理程序,它映射来自 foo.c 的回调的结构并将它们传递给用户回调,在 api.h 中重新定义结构(使用不同的名称)或者是否有开销更少的解决方案?

当我在 api.h 中为 foo.h 定义必要的结构时,我需要在 foo.h 中包含 api.h,而且在 api.h 中包含 foo.h,我认为这不是一个好主意.

最佳答案

对于问题的第一部分,像 sinf 这样的数学运算应该由 C 标准库处理(你应该检查你的特定版本以支持你的体系结构)。然后您可以使用 math.h header 及其函数,然后编译器应使用 FPU 进行浮点计算。


对于第二部分,向用户显示隐藏结构的常用方法是使用转发声明,但用户必须通过指针和访问函数与该结构进行交互。

以你为例,假设我们有四个文件:

  • api.h: 公共(public) header
  • api.c:来自公共(public)头文件的函数源代码
  • foo.h:库内部头文件(不会发送给最终用户)
  • foo.c: 内部函数的源代码

api.h 是其中唯一有趣的文件(没有变化)。

// file: api.h
#ifndef API_H
#define API_H

struct foo; // forward declaration of the foo structure

typedef void (*callback_t)(struct foo*); // typedef for a callback taking a
// struct foo argument

void set_callback(callback_t fn);
#endif

现在我们有了回调的类型和给回调的结构类型,但是用户不能与结构本身交互,因为编译器只知道它存在但不知道它的内容(也不知道存储大小) .

当用户编写如下代码中的回调时,用户将需要一些访问函数。

#include "api.h"

void user_callback(struct foo* arg) {
// user code here
}

访问函数通常是这样定义的:

// in the file api.h or another header that the user has access to

int foo_get_value1(struct foo* arg);
void foo_set_value1(struct foo* arg, int new_value);

这些函数将在 foo.c

中实现
struct foo {
int value1;
int value2;
};

int foo_get_value1(struct foo* arg) {
return arg->value1;
}

void foo_set_value1(struct foo* arg, int new_value) {
arg->value1 = new_value;
}

这种方法还有一个额外的优势,即您的 foo_set 函数可以进行有效性检查,以确保您的结构中有适当的值。

请注意:我没有对我的访问函数添加任何检查以避免代码困惑,但是当将指针传递给函数时,您应该始终检查它是否为 NULL

关于c - 静态库结构和包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55322161/

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