我写了C库,我不知道如何让一些函数对用户不可见(用于实现功能)。 C有什么办法吗?我的第二个问题是:当我在.h或.c文件中包含一些库时(让我们看看math.h)当用户在他的程序中声明相同的头文件时(当然使用我的库)会有任何问题?
结构怎么样?有没有关键词?
答案 0 :(得分:0)
通常的方法是使实现函数为静态,即使用存储说明符static
声明它们,并将它们放在带有代码的模块中。因此,两个标题都不会引用这些函数。
答案 1 :(得分:0)
如何使某些功能不可见?
static
示例:
您-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.o
和lib2.o
使用。你不能在这里使用static,因为这些函数对他们来说是不可见的,而且链接会失败。
你能做什么:
使辅助函数非静态,并为链接器提供版本脚本,它只导出所需的符号:
gcc -shared lib1.o lib2.o util.o -o mylib.so -Wl,--version-script=map
文件map
可以包含以下内容:
{
global:
bar;
baz;
local: *;
};
这只会导出符号bar
和baz
(这是此示例库的相关API函数),同时省略符号表中的所有其他符号。