C库包括

时间:2016-01-24 10:59:48

标签: c include

我写了C库,我不知道如何让一些函数对用户不可见(用于实现功能)。 C有什么办法吗?我的第二个问题是:当我在.h或.c文件中包含一些库时(让我们看看math.h)当用户在他的程序中声明相同的头文件时(当然使用我的库)会有任何问题?

结构怎么样?有没有关键词?

3 个答案:

答案 0 :(得分:0)

通常的方法是使实现函数为静态,即使用存储说明符static声明它们,并将它们放在带有代码的模块中。因此,两个标题都不会引用这些函数。

答案 1 :(得分:0)

  

如何使某些功能不可见?

  1. 不要在库的头文件中声明该函数
  2. 在库的源文件中将函数定义为static
  3. 示例:

    您-lib.h

    #ifndef YOUR_LIB_H
    #define YOUR_LIB_H
    
    void do_public_stuff(void);
    
    #endif YOUR_LIB_H
    

    您-lib.c

    #include "your-lib.h"
    
    // this functions is invisible
    static void do_private_stuff(void)
    {
        // ...
    }
    
    // this functions is visible
    void do_public_stuff(void)
    {
        // ...
    }
    

    用户-code.c

    #include "your-lib.h"
    
    int main(void)
    {
        do_public_stuff();
        return 0;
    }
    

答案 2 :(得分:0)

您可以使用关键字static作为建议的其他答案。 但有时候,库本身将包含几个源文件和目标文件,并且可能存在必须在整个库中使用的函数,但在链接之后不得导出

简单示例:

你的库有3个对象:lib1.o lib2.o util.o

位于util.o的是几个辅助函数,由lib1.olib2.o使用。你不能在这里使用static,因为这些函数对他们来说是不可见的,而且链接会失败。

你能做什么:

使辅助函数非静态,并为链接器提供版本脚本,它只导出所需的符号:

gcc -shared lib1.o lib2.o util.o -o mylib.so -Wl,--version-script=map

文件map可以包含以下内容:

{
    global: 
        bar;
        baz;
    local: *;
};

这只会导出符号barbaz(这是此示例库的相关API函数),同时省略符号表中的所有其他符号。