Awa*_*ais 4 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
}
Run Code Online (Sandbox Code Playgroud)
在test.h中,我只暴露了一个函数,即
void A();
Run Code Online (Sandbox Code Playgroud)
现在B()明显依赖于放入A()的条件,否则它不能运行,因为只有A()在test.h中公开,那么用户不会知道他/她也可以直接调用B().现在我担心的是,如果用户知道(或猜测)我的模块中有一些名为B()的函数可以绕过A()直接调用,那么它可能会影响我的实现.
我知道在这种情况下C++会更好,因为公共和私有方法,我也有一个想法,我可以通过在B()中使用A()的一些标志检查来阻止B()直接调用,但我想知道如果有任何其他方法,以便用户无法调用我的函数(如B()),这些函数未在头文件中公开.
制作功能B:
static void B(void)
{
//some code here
}
Run Code Online (Sandbox Code Playgroud)
其可见性将仅限于定义它的翻译单元.B将有内部联系; A将有外部联系.
另一种仅在某些 *NIX 上由 gcc/clang 支持的链接是“隐藏”链接。
您可以像这样定义一个函数:
__attribute__((visibility, ("hidden"))) void foo(void) {
return;
}
Run Code Online (Sandbox Code Playgroud)
这将允许从共享对象中的另一个点调用该函数,但不能在该点之外调用该函数。也就是说,它可以从不同的翻译单元调用,但不能从使用您的库的应用程序调用。
有关更多信息,请参阅http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Function-Attributes.html。
| 归档时间: |
|
| 查看次数: |
1957 次 |
| 最近记录: |