V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ReputationZh
V2EX  ›  程序员

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

  •  
  •   ReputationZh · 2020-10-29 10:35:43 +08:00 · 2959 次点击
    这是一个创建于 1487 天前的主题,其中的信息可能已经有所发展或是发生改变。
    17 条回复    2020-10-29 15:53:57 +08:00
    ysc3839
        1
    ysc3839  
       2020-10-29 11:29:22 +08:00 via Android
    > 不想暴露任何数据结构,只提供 api 。

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

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

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

    定义 opaque type 的话,typedef struct MyApiType MyApiType 就行了。
    tamlok
        13
    tamlok  
       2020-10-29 13:04:46 +08:00 via Android
    学一下 qt 的源码?
    ipwx
        14
    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
        15
    yyid  
       2020-10-29 14:45:14 +08:00
    输入输出都是地址,里面是什么自己控制
    ychost
        16
    ychost  
       2020-10-29 15:49:42 +08:00
    为啥要隐藏数据结构?这个很重要?
    HannibaI
        17
    HannibaI  
       2020-10-29 15:53:57 +08:00   ❤️ 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3324 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:49 · PVG 08:49 · LAX 16:49 · JFK 19:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.