C++命名空间,与 Java 包的比较

2022-08-31 22:10:26

我最近做了一堆Java编码,并且已经习惯了非常具体的包命名系统,例如。这在Java,AS3 / Flex和C#中工作正常。我也在C++中看到了相同的范例,但我也听说,将C++命名空间视为Java包的直接对应物是不好的。com.company.project.db

这是真的吗,为什么?命名空间/包如何相似和不同?如果使用深度嵌套命名空间,可能会发现哪些问题?


答案 1

在C++命名空间只是对可用名称进行分区。Java包是关于模块的。命名层次结构只是其中的一个方面。

C++中深度嵌套命名空间本身并没有错,除了它们通常不是必需的,因为它们后面没有模块系统,额外的层只会增加噪音。通常,拥有一个或两个级别的命名空间就足够了,内部详细信息(通常称为 Details)具有奇怪的额外级别。

还有一些额外的规则来C++命名空间,如果过度使用,这些规则可能会吸引您 - 例如参数依赖查找,以及有关解析为父级别的规则。WRT后者,取:

namespace a{ namespace b{ int x; } }
namespace b{ string x; }
namespace a
{
  b::x = 42;
}

这合法吗?很明显发生了什么吗?您需要知道命名空间解析的优先级才能回答这些问题。


答案 2

Java包不是嵌套的,它们是扁平的。任何明显的嵌套都只不过是一种命名约定。

例如,包与 或 没有任何关系。与 中的代码相比,中的代码对 中的代码的访问权限不多。com.company.project.dbcom.company.projectcom.company.project.db.xcom.company.project.dbcom.company.project.db.xa.b.c


推荐