我正在用 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() 中的条件,否则它无法运行,并且由于 test.h 中仅公开了 A(),因此用户不会知道他/她也可以直接调用 B()。现在我担心的是,如果用户知道(或通过猜测)我的模块中有一些名为 B() 的函数,可以通过绕过 A() 直接调用它,那么它可能会损害我的实现。
我知道在这种情况下 C++ 会更好,因为有公共和私有方法,而且我也有一个想法,我可以通过在 B() 中使用 A() 的一些标志检查来防止直接调用 B() 但我想知道是否有任何其他方法,以便用户无法调用我的函数(如 B()),这些函数未在头文件中公开。
另一种仅由某些 *NIX 上的 gcc/clang 支持的链接是“隐藏”链接。
您可以像这样定义一个函数:
__attribute__((visibility, ("hidden"))) void foo(void) {
return;
}
这将允许从共享对象中的另一个点调用该函数,但没有点 在那之外。也就是说,它可以从不同的翻译单元调用,但不能从使用您的库的应用程序调用。
请参阅 http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Function-Attributes.html 了解更多信息。