【问题标题】:Best Known Method for naming namespaces in C++ // what to do when names collide?在 C++ 中命名命名空间的最知名方法 // 名称冲突时该怎么办?
【发布时间】:2013-01-11 02:22:48
【问题描述】:

好的,所以我知道我应该将我的代码嵌入到命名空间中以处理名称冲突。 例如

My-Header-Only-Library.hpp

    namespace AG {
    namespace My_Header_Only_Library {

    class Foo {
        ...
    };

    }
    }

所以我有 AG::My_Header_Only_Library::Foo。

是的,我经常使用两个级别 - 第一个级别,不同的是 AG、AFG、libAG 等 - 用于“我的”内容(我已经维护了其中一些库数十年,例如 Valid<T>)。

而且我经常有各种模块的子命名空间。

问题 #1:命名空间名称有时会发生冲突。

是的:我发现所有名称空间名称 AG、AFG、libAG 的冲突。是的,我遇到过和我名字首字母相同的公司。

(有段时间我用GLEW,以为这是一个比较独特的姓氏。当时我是互联网上唯一的Glew,也是ARPAnet上第48个首字母为AG的人。(AG48)。但自从然后,OpenGL Extensions Wrangler 几乎把它从我身上拿走了。)

我认为“命名空间 AG_some_random_stuff_675567”不太可能发生冲突。人是这样的吗?使用一些长命名空间名称,然后使用

using AG_lib = AG_some_random_stuff_675567

或者你有没有尝试过像#defining 命名空间的名字这样的把戏。

例如

#define AG something_more_unique

问题 #2:我有时会给予、借出、允许公司使用我的图书馆。有点我要求他们回馈更改,即他们不分叉。

它们的编码约定可能不一样。

我不希望他们更改命名空间名称,因为这会使他们更难撤回更改。

问:怎么办?让他们做

using Their_Name = AG_some_random_stuff_675567

【问题讨论】:

  • 下一步是什么?命名空间命名约定?

标签: c++ namespaces header-files libraries


【解决方案1】:

我通常从命名空间包含的内容、我的全名和创建日期开始——理论上这也不是 100% 不受冲突影响,但它非常接近1。如果您真的想要更接近免疫的东西,您可以生成一个 GUID 并改用它。

那么,当然是的,大多数正常使用的别名要短得多。不幸的是,您不能总是使用别名来代替完整的命名空间名称,但这就是生活。


  1. 至少对我而言,它非常接近——不过,一个更常见的名称所提供的保护会少很多。

【讨论】:

  • 我将接受这个答案作为最好的答案,尽管我认为我的个人 BKM 将是这个和 Java 风格方法的混合体。
【解决方案2】:

您处于损坏控制模式。在与其内部名称冲突的状态下接收您的库的公司将需要修改其客户端代码以消除冲突库的歧义。

AG_some_random_stuff_675567 显然是矫枉过正,AG 显然(也许只是回想起来)太可能发生冲突。选择一些相当独特的东西,以便未来的客户可以在没有using 别名的情况下使用它。例如all_good。 (尽管,如果要求客户添加自己的 using 别名不会导致营销或支持问题,那么使用 random_stuff 的命名空间将是完全安全的。)

然后,您可以在自己的代码中添加using namespace AG = all_good;,并指示旧客户端执行相同操作,以实现向后兼容。

也许可以使用预处理器标志来帮助迁移客户端,方法是选择谁在全局命名空间中获得using 指令,但绝不应该使用预处理器宏来重命名命名空间!像AG 这样的名字已经被证明会发生冲突。

【讨论】:

    【解决方案3】:

    不要使用缩写,使用已分配的命名空间。例如,反转您的完全限定域名的 Java 实践非常有效。使用我的代码,我可以安全地使用

    namespace com {
        namespace benvoigt {
        }
    }
    

    并且知道它不会与外部实体发生冲突,因为其他人不可能拥有域 benvoigt.com 的所有权。

    【讨论】:

    • com 完成了什么?一个可能发生冲突的名字是没有用的。 C++ 不是 Java。
    • 嗯...ca::glew ...我想知道“Computer Associates”公司是否有人使用 Open GL Extensions Wrangler。
    • @BenVoigt Java 指定名称空间对应于域。 C++ 没有。加拿大和计算机协会都很大。 com 可以表示“通用”或 Microsoft 通用对象模型。如果有人这样做 using namespace com; 因为那是他们放置他们的公共库的地方,那么你又回到了第一格。
    • @Potatoswatter:即使在 Java 中,它也是约定而不是要求。没有什么能解决故意碰撞的问题。如果需要,可以将使用此约定的所有内容放在另一个命名空间中,例如 fqdn
    • @KrazyGlew 结果是,使用com_benvoigt 将两全其美。用范围运算符替换下划线只是一个失败的提议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 2023-03-11
    • 1970-01-01
    • 2013-12-11
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多