gpt4 book ai didi

c - 如何在C中为静态库设计接口(interface)

转载 作者:行者123 更新时间:2023-12-02 22:24:01 26 4
gpt4 key购买 nike

虽然我不是一个经验丰富的 C 程序员,但我必须在工作中使用这种语言来构建一个在 SunOS 和 Win32 上都可以编译的静态库。这个库只有几个源文件和它们对应的头文件(比方说:a.cb.ca.hb.h).该项目在两个平台上编译并生成库 mylib.a

我的问题是如何将mylib.a 实现的功能公开给其他项目,因为当我同时添加a.hb.h 时,我得到一些宏重新定义错误。

编辑:我发现宏重新定义错误是因为编译命令中的宏定义(与我的头文件无关)并且它已解决:)但我仍然希望获得有关组织我的源文件和头文件的建议。

我的疑问是我是否修改了a.hb.h 以供外部使用,或者我是否应该创建一个专门用于声明该库接口(interface)的头文件(比方说mylib.h)。我不想使原始 header 过于复杂,但我不想让不同的 header 保持同步......我想听听更有经验的 C 程序员关于他们的模式、每种方法的优点以及是否还有其他选项。

提前谢谢你。

编辑:似乎我没有提供足够的信息;下面的模式试图展示我的文件是如何组织的:每个代码文件只包含它的头文件,每个头文件都有一个保护条件,每个头文件包含一个公共(public)头文件,这个公共(public)头文件包含所有头文件。

// a.c ----
#include "a.h"

// b.c ----
#include "b.h"

// a.h ----
#ifndef GUARD_A_H
#define GUARD_A_H
# include "liball.h"
void function_prototypes_implemented_in_a();
#endif // GUARD_A_H

// b.h ----
#ifndef GUARD_B_H
#define GUARD_B_H
# include "liball.h"
void function_prototypes_implemented_in_b();
#endif // GUARD_B_H

// liball.h ----
#ifndef GUARD_LIBALL_H
#define GUARD_LIBALL_H
# include <time.h> // standard headers
# include <stdioa.h>

# include "a.h" // all headers in this project
# include "b.h"
#endif // GUARD_LIBALL_H

最佳答案

您应该有一个公共(public) header ,mylib.h,它只包含库的用户需要知道的定义。

然后您将拥有一个在您的项目中使用的私有(private) header mylib-internal.h。你不应该试图让两者“同步”,而是让 mylib-internal.h 包含 #include "mylib.h"

您还应该命名所有接口(interface)函数,例如 mylib_initialize() 等,并确保所有私有(private)的内部函数都声明为 static,或者命名为 _mylib_internal_whatever(),这样用户就不会与其他库发生命名空间冲突。

关于c - 如何在C中为静态库设计接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13250001/

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