即使在使用名称空间之后,如果名称冲突,该怎么办
What if there is a name clash even after using namespace?
我们通常使用名称空间来避免C++中的名称冲突。但是,如果有两个不同的库有一个类,具有相同的命名空间名称和类名,该怎么办?附近有工作吗?
(附言:我很确定,这是一种罕见的情况,我从未面对过,只是碰巧想到了)
这个想法是使用与公司/集团本身相关的东西
这样就避免了碰撞
专业图书馆不太可能选择像MyNamespace
这样琐碎的东西。
就像Company::Project::Module
。
这在java中更为清楚,因为您有org.apache etc
这可能会发生,但不太可能对你造成太大伤害。不仅名称空间名称必须完全相同,而且还必须实际使用这两个库。很可能,如果它们以某种合理的方式命名了名称空间,它们的名称将表明它们的用途——即使有两个库使用GenericXMLParser
作为名称空间,并且可能有一些共同的类名,你真的希望在一个项目中同时使用它们吗?
这确实会使某些命名空间名称成为一个坏主意,例如boost
或Ogre
。任何使用这些库的人(除了原始用户)都应该预料到他们的库在许多情况下是不可用的。一个不太常见的名字,比如Pie
,可能在大多数情况下对大多数人来说都很好。如果使用Pie
的两个库都得到广泛使用,其中一个可能不得不更改;在这种情况下,可以使用名称空间重命名技巧来保持与旧代码的向后兼容性。
您可以使用重命名其中一个命名空间
namespace <new> = <old>;
但这只会让你走到这一步。这里有一个例子:
namespace aaa {
int foo() { return 42; }
}
namespace zzz {
int foo() { return -42; }
}
namespace bbb = aaa;
int main() {
aaa::foo(); //Original namespace is still there
bbb::foo(); //but it is also available with a new name
zzz::foo(); //No clash, that's what namespaces are for
return 0;
}
但是,由于重命名实际上只是一个别名,所以aaa
命名空间会保留下来。这段代码会给你一个重复的符号错误(无论它在.h文件中埋得有多深):
namespace aaa {
int foo() { return 42; }
}
namespace aaa {
int foo() { return -42; }
}
您可以通过在自己的名称空间声明中封装冲突的名称空间来绕过它,如下所示:
#include <stdio.h>
namespace aaa {
int foo() { return 42; }
}
namespace zzz {
#include "clash.h"
}
namespace aaa2 = zzz::aaa;
int main() {
printf("%dn", aaa::foo()); //Original works
printf("%dn", aaa2::foo()); //Non-clashing through alias
printf("%dn", zzz::aaa::foo()); //Non-clashing real name
return 0;
}
但该解决方案也只能在琐碎的代码中工作,因为clash.h
中包含的所有文件最终都将位于zzz
命名空间中。
+不过,我认为重命名std
是被禁止的,哪怕只是出于常识。
- 如果没有malloc,链表实现将失败
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 写入位置0x0000000C时发生访问冲突
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- C++擦除(如果存在)
- 如果使用低于 VS2015 的 vc++ 编译器版本编译,则 DLL 中的访问冲突
- 如果外部"C"包含与Qt库发生冲突怎么办?
- 如果从其他线程访问(读/写)src缓冲区,是否有可能从memcpy获得访问冲突
- 如果应用程序以windows上的管理权限从cmd打开,则会出现访问冲突
- 即使在使用名称空间之后,如果名称冲突,该怎么办
- 未处理的异常-如果/SUBSYSTEM参数发生更改,则访问冲突
- 如果通过指针访问这个函数,为什么会导致访问冲突?