在c++中命名命名空间的最佳方法//当名称冲突时该怎么做

Best Known Method for naming namespaces in C++ // what to do when names collide?

本文关键字:冲突 方法 c++ 命名空间 最佳      更新时间:2023-10-16

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

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:命名空间名称有时会冲突。

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

(有一段时间我使用GLEW,认为这是一个相当独特的姓氏。那时候,我是互联网上唯一的一个人,也是阿帕网上第48个缩写为AG的人。(AG48)。但从那以后,OpenGL Extensions Wrangler几乎把我带走了。)

我认为"命名空间AG_some_random_stuff_675567"不太可能发生碰撞。人们都这么做吗?使用一些较长的命名空间名称,然后使用

using AG_lib = AG_some_random_stuff_675567

或者您是否尝试过像#将名称空间的名称定义为其他东西这样的把戏?

#define AG something_more_unique

问题#2:我有时给、借给、允许公司使用我的图书馆。但我要求他们把更改还给我,也就是说,他们不要分叉。

它们的编码约定可能不相同。

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

问:该怎么办?让他们做

using Their_Name = AG_some_random_stuff_675567

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

然后,当然是的,有一个更短的别名,大多数正常使用。不幸的是,您不能总是使用别名来代替完整的命名空间名称,但这就是生活。


  1. 至少对我来说很接近——一个更常见的名字会提供更少的保护。

你进入了损害控制模式。收到您的库的公司处于与其内部名称冲突的状态,将需要修改其客户端代码以消除冲突库的歧义。

AG_some_random_stuff_675567显然是过度杀伤的,而AG显然(也许只是回顾一下)太可能发生碰撞。选择一些比较独特的东西,以便将来的客户可以在没有using别名的情况下使用它。例如all_good。(虽然,如果要求客户端添加自己的using别名不会引起营销或支持问题,那么使用random_stuff的名称空间将是完全安全的。)

然后,您可以在自己的代码中添加using namespace AG = all_good;,并指示旧的客户端做同样的事情,作为向后兼容的一种手段。

也许可以使用预处理器标志来帮助迁移客户端,通过选择谁在全局命名空间中获得using指令,但你不应该使用预处理器宏来重命名命名空间!而像AG这样的名字已经被证明是碰撞的

不要使用首字母,使用已经分配的名称空间。例如,反转完全限定域名的Java实践工作得非常好。在我的代码中,我可以安全地使用

namespace com {
    namespace benvoigt {
    }
}

并知道它不会与外部实体冲突,因为任何人都不可能拥有域名benvoigt.com的所有权。