我最近完成了一堆 Java 编码,并且已经习惯了非常具体的包命名系统,例如深度嵌套。 com.company.project.db
。这在 Java、AS3/Flex 和 C# 中运行良好。我也看到在 C++ 中应用了相同的范例,但我也听说将 C++ 命名空间视为 Java 包的直接对应物是不好的。
这是真的吗,为什么?命名空间/包有什么相似之处和不同之处?如果您使用深度嵌套的命名空间,可能会出现什么问题?
最佳答案
在 C++ 中,命名空间只是对可用名称进行分区。 Java 包是关于模块的。命名层次只是其中一个方面。
C++ 中深度嵌套的命名空间本身并没有什么问题,只是它们通常不是必需的,因为它们背后没有模块系统,而且额外的层只会增加噪音。 通常有一层或两层命名空间就足够了,还有一些奇怪的额外层用于内部细节(通常称为细节)。
C++ 命名空间还有一些额外的规则,如果过度使用这些规则可能会发现你 - 例如 argument-dependent-lookup ,以及围绕解决父级别的规则。 WRT 后者,采取:
namespace a{ namespace b{ int x; } }
namespace b{ string x; }
namespace a
{
b::x = 42;
}
这合法吗?发生了什么很明显吗? 您需要知道命名空间解析的优先级才能回答这些问题。
关于java - C++ 命名空间,与 Java 包的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2108172/