在c++中命名命名空间的最佳方法//当名称冲突时该怎么做
Best Known Method for naming namespaces in C++ // what to do when names collide?
好的,所以我知道我应该将代码嵌入到名称空间中以处理名称冲突。例如
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并使用它。
然后,当然是的,有一个更短的别名,大多数正常使用。不幸的是,您不能总是使用别名来代替完整的命名空间名称,但这就是生活。
- 至少对我来说很接近——一个更常见的名字会提供更少的保护。
你进入了损害控制模式。收到您的库的公司处于与其内部名称冲突的状态,将需要修改其客户端代码以消除冲突库的歧义。
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
的所有权。
- 工厂方法中的访问冲突
- 具有相同名称的方法和内部类(错误:.. 与前面的声明冲突)
- 可视模板参数名称与 MSVC C++中的方法冲突
- C Socket 和 Omnet++ 之间的方法名称冲突
- 相互冲突名称的成员变量和方法变量
- Box2d C++访问冲突使用b2fixture超出方法
- 超级方法调用中的C++名称冲突
- 我应该如何处理类型而不是方法的多重继承冲突
- 调用基类的方法时发生访问冲突
- 宏和方法之间可能存在的冲突
- 如何解决调用 dll 方法时的访问冲突写入位置
- 解决运行时库冲突的好方法是什么?
- 宏定义的tcl-8.5.12和qt-4.7.4中的方法之间的冲突
- Valgrind:getter方法中包含rdlock的线程加载冲突
- Arduino方法名称与库函数冲突
- c++中返回类型名称与方法名称冲突
- 在鼠标钩子代码中调用方法会导致访问冲突
- 访问dll方法时的访问冲突读取位置
- 访问冲突直接x更新方法
- 具有冲突方法的多重继承