仅在C中公开所需的功能

时间:2012-11-01 09:21:05

标签: c api shared-libraries static-libraries

我正在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()),这些函数未在头文件中公开。

2 个答案:

答案 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