• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ReputationZh
V2EX  ›  程序员

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

  •  
  •   ReputationZh · Oct 29, 2020 · 3830 views
    This topic created in 2023 days ago, the information mentioned may be changed or developed.
    17 replies    2020-10-29 15:53:57 +08:00
    ysc3839
        1
    ysc3839  
       Oct 29, 2020 via Android
    > 不想暴露任何数据结构,只提供 api 。

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

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

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

    定义 opaque type 的话,typedef struct MyApiType MyApiType 就行了。
    tamlok
        13
    tamlok  
       Oct 29, 2020 via Android
    学一下 qt 的源码?
    ipwx
        14
    ipwx  
       Oct 29, 2020
    我寻思就连 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  
       Oct 29, 2020
    输入输出都是地址,里面是什么自己控制
    ychost
        16
    ychost  
       Oct 29, 2020
    为啥要隐藏数据结构?这个很重要?
    HannibaI
        17
    HannibaI  
       Oct 29, 2020   ❤️ 1
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5512 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 112ms · UTC 09:02 · PVG 17:02 · LAX 02:02 · JFK 05:02
    ♥ Do have faith in what you're doing.