c模块中的命名空间或包

时间:2017-03-13 04:19:01

标签: c namespaces package shared-libraries static-libraries

我是一名来自高级语言的初级C程序员,感觉像c是扁平结构。有没有一种模拟包的方法,所以我可以拥有一个干净的命名空间而不需要前缀。

嵌套结构就是我所看到的。

它如何与第三方外部库一起使用,当名称冲突时会发生什么或者它是分开的。

如果我要构建一个库或一个与libs链接的多模块应用程序,那么每个模块都可以有一个与另一个模块相同的变量,函数或结构名称。

此外,如果您要链接两个名称冲突的第三方库(.a文件等),您将如何解决此类冲突。

1 个答案:

答案 0 :(得分:0)

好的,从技术上来说,没有办法让命名空间与C ++完全相同。不幸的是,这会导致像SDL2这样的东西,它为每个函数添加“SDL_”前缀。关于解决外部库之间的冲突,有一个解决方案。假设我们有库“libfoo”,它具有函数

void do_foo(void *);

定义。您尝试编译和链接您的程序,但事实证明您正在使用的另一个库“libfu”也具有此功能。现在我要做的是创建一些适配器库,用适当的前缀重命名该函数。所以我们将有一个定义函数

的文件“libfoo_f.h”
void FOO_do_foo(void *);

和“libfoo_f.c”

#include"libfoo_f.h"
#include<libfoo.h>
void FOO_do_foo(void *data)
{
    do_foo(data);
}

所有这个功能都提供了一种在不破坏库的情况下访问libfoo的do_foo的方法。老实说,我从来没有这样做过,因为大多数库都有结构良好,命名良好的接口,不太可能与其他库发生冲突。