【问题标题】:namespace or packages in c modulesc 模块中的命名空间或包
【发布时间】:2017-08-03 01:14:34
【问题描述】:

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

嵌套结构是我正在研究的一种结构。

它如何与第三方外部库一起工作,当存在名称冲突或它是独立的时会发生什么。

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

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

【问题讨论】:

  • 不需要前缀?不,这是你正在使用的 C。
  • C 不是 C++
  • 是的,只有 C,没有 C++,多模块应用程序的任何策略都有自己的隔离区域,以避免名称冲突。感谢你的帮助。我对 c 没有太多经验,所以请纠正假设。
  • @ShawnicHedgehog 它是如何工作的,假设您链接的两个外部库是否相互冲突、名称冲突?
  • 库名冲突?库方法名称冲突?库全局变量冲突?

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


【解决方案1】:

好吧,从技术上讲,不,没有办法以与 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 的方法。老实说,我从来没有这样做过,因为大多数库都有结构良好、命名良好的接口,不太可能与其他库发生冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多