5

我正在用 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())。

4

2 回答 2

11

制作功能B

static void B(void)
{
  //some code here
}

它的可见性将仅限于定义它的翻译单元。B将有内部联系;A会有外部联系。

于 2012-11-01T09:22:19.790 回答
6

在某些 *NIX 上仅由 gcc/clang 支持的另一种链接是“隐藏”链接。

您可以像这样定义一个函数:

__attribute__((visibility, ("hidden"))) void foo(void) {
      return;
}

这将允许从共享对象中的另一个点调用该函数,但不能在该点之外调用该函数。也就是说,它可以从不同的翻译单元调用,但不能从使用您的库的应用程序调用。

有关详细信息,请参阅http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Function-Attributes.html

于 2012-11-01T10:25:04.393 回答