用 C 写一个动态库,需要注意什么,不想暴露任何数据结构,只提供 api。应该怎么去做?

2020-10-29 10:35:43 +08:00
 ReputationZh
2964 次点击
所在节点    程序员
17 条回复
ysc3839
2020-10-29 11:29:22 +08:00
> 不想暴露任何数据结构,只提供 api 。

正常写就好了,为什么会暴露?没明白你遇到了什么问题。
lcdtyph
2020-10-29 11:37:00 +08:00
typedef struct mystruct *mystruct_t;

mystruct_t mystruct_new(...);
void mystruct_destroy(mystruct_t);
....

这样头文件里不会暴露这个结构体的细节
RoyceLee
2020-10-29 11:41:13 +08:00
不透明指针
GM
2020-10-29 11:43:11 +08:00
入参、出参、返回值只用自带类型( int 、float 、char 等以及对应的数组、指针),不要用任何自定义类型就好了。
optional
2020-10-29 11:48:22 +08:00
c 又没有保留编译信息,你头文件不给数据结构,谁还能知道你的数据结构不成?
sillydaddy
2020-10-29 11:50:11 +08:00
用 handle 啊,相当于令牌(token)。如果 api 之间有关联(比如第 2 个 api 用到第 1 个 api 的运算结果),就可以使用 handle 来传递信息,handle 就是内部数据的指代名称,外界看不到。
xiangyuecn
2020-10-29 12:03:07 +08:00
删掉文档,删掉提交记录?🐶
nightwitch
2020-10-29 12:08:28 +08:00
头文件只写结构体的前向声明和函数声明,实现放到.c 里面。
TreStone
2020-10-29 12:08:49 +08:00
handle +1
icyalala
2020-10-29 12:15:35 +08:00
2 楼正解。。用 handle 那套逻辑会更麻烦
23571113
2020-10-29 12:33:17 +08:00
迭代器?
hitmanx
2020-10-29 12:37:50 +08:00
gcc 的话可以用__attribute__ visibility 显式控制哪些 symbol 你要 export,配合-fvisibility=hidden 去掉那些不该暴露的 symbol

定义 opaque type 的话,typedef struct MyApiType MyApiType 就行了。
tamlok
2020-10-29 13:04:46 +08:00
学一下 qt 的源码?
ipwx
2020-10-29 14:30:46 +08:00
我寻思就连 C++ 也能隐藏实现细节。。。
----

// SomeThing.hpp:

class SomeThingPrivate;

class SomeThing {
private:
SomeThingPrivate *__actual_thing;

public:
SomeThing();

void some_function();
};

// SomeThing.cpp

class SomeThingPrivate {
public:
void some_function();
};

SomeThing::SomeThing() : __actual_thing(new SomeThingPrivate()) {
};

SomeThing::some_function() {
this->__actual_thing->some_function();
}
yyid
2020-10-29 14:45:14 +08:00
输入输出都是地址,里面是什么自己控制
ychost
2020-10-29 15:49:42 +08:00
为啥要隐藏数据结构?这个很重要?
HannibaI
2020-10-29 15:53:57 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/719689

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX