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

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

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

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

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

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

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