我正在C中编写一个小型API库的模块。我将编译这个模块并将其交给我的开发人员,我将在我的模块的头文件中公开一些必需的函数,以便使用我的模块的开发人员知道哪个函数调用所需的功能。现在我想询问一件事:我是否可以只在C中公开所需的功能,例如
我有test.c:
#include "test.h"
void A()
{
if( some condition is true )
B();
else
return;
}
void B()
{
//some code here
}
在test.h中,我只暴露了一个函数,即
void A();
现在B()显然依赖于放入A()的条件,否则它无法运行,因为只有A()在test.h中公开,那么用户不会知道他/她也可以直接调用B() 。现在我担心的是,如果用户知道(或猜测)我的模块中有一些名为B()的函数可以绕过A()直接调用,那么它可能会影响我的实现。
我知道在这种情况下C ++会更好,因为公共和私有方法,我也有一个想法,我可以通过在B()中使用A()的一些标志检查来阻止B()直接调用但是我想知道是否有任何其他方法,以便用户无法调用我的函数(如B()),这些函数未在头文件中公开。
答案 0 :(得分:9)
创建函数B
:
static void B(void)
{
//some code here
}
其可见性将仅限于定义它的翻译单位。 B
将具有内部联系; A
将有外部链接。
答案 1 :(得分:4)
在某些* NIX上仅由gcc / clang支持的另一种链接是“隐藏”链接。
您可以像这样定义一个函数:
__attribute__((visibility, ("hidden"))) void foo(void) {
return;
}
这将允许从共享对象中的另一个点调用该函数,但没有任何意义 在那之外。也就是说,它可以从不同的翻译单元调用,但不能使用您的库从应用程序调用。
有关详细信息,请参阅http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Function-Attributes.html。