C库包括

C library include

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

那么结构呢?有关键词吗?

通常的方法是将实现函数设为静态,即使用存储说明符 static 声明它们,并将它们与代码一起放入模块中。因此 header 都不会引用这些函数。

how to make some functions invisible ?

  1. 不要在你的库的头文件中声明函数
  2. 在您的库的源文件中将函数定义为 static

示例:

your-lib.h

#ifndef YOUR_LIB_H
#define YOUR_LIB_H

void do_public_stuff(void);

#endif YOUR_LIB_H

your-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)
{
    // ...
}

user-code.c

#include "your-lib.h"

int main(void)
{
    do_public_stuff();
    return 0;
}

您可以使用关键字 static 作为其他答案的建议。 但有时,库本身会由几个源和object-files组成,并且可能有一些功能,必须在整个库中使用,但不应在链接后导出[=39] =].

简单例子:

您的图书馆有 3 个对象:lib1.o lib2.o util.o

位于 util.o 中的是几个 helper-functions,它们被 lib1.olib2.o 使用。您不能在此处使用静态,因为函数对它们不可见并且链接会失败。

你能做什么:

制作 helper-functions non-static 并为链接器提供 版本脚本 ,它只导出所需的符号:

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

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

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

这只会导出符号 barbaz(与此示例库相关的 API-functions),而忽略符号 [=51= 中的所有其他符号].