术语“命名空间污染”是什么?意思是为什么要使方法静态有助于防止它?
This question似乎很相似,但与JavaScript有特殊关系,答案并未定义该术语。
答案 0 :(得分:10)
命名空间只是存在名称的空间(现在看起来很明显)。
假设你有两段代码,一段用于处理链表,另一段用于处理树。现在,这两段代码都将受益于getNext()
函数,以帮助遍历数据结构。
但是,如果两者定义具有相同名称的函数,则可能会发生冲突。输入以下代码时,编译器会做什么?
xyzzy = getNext (xyzzy);
换句话说,你真正想要使用哪个getNext()
?有很多方法可以解决这个问题,例如使用面向对象的代码,您可以使用:
xyzzy = xyzzy.getNext();
并且由于您通过变量xyzzy
本身指定了类型,因此会自动选择正确的。
但是,即使使用大多数OO代码,也可能存在冲突的情况,这就是命名空间进入图片的位置。它们允许您将名称放在它们自己的区域中,以便区分它们。
作为一个例子,C ++将其所有标准库内容放入std
命名空间。如果出于某种原因,您需要fopen()
或rand()
函数与库中的函数不同,则可以将其放在自己的命名空间中以使它们保持独立
现在描述了命名空间冲突。从技术上讲,命名空间污染只是将你的符号留在它们不应该存在的命名空间中。这不一定会导致冲突,但它更有可能发生冲突。
将方法设为静态(使用类C语言)的原因与给定翻译单元之外的世界可用的名称有关(例如,链接时)。使用代码:
int get42 (void) { return 42; }
int main (void) { return get42(); }
这些函数的两个都可供链接器使用。
除非您需要从其他地方拨打get42()
,否则请将其设为静态:
static int get42 (void) { return 42; }
int main (void) { return get42(); }
将阻止它污染链接器维护的命名空间 - 在C中,将static
限定符应用于文件级对象或函数会为其提供内部链接。
它与C ++命名空间的相似之处在于,您可以在400个不同的源文件中拥有static int get42()
,并且它们不会相互干扰。
答案 1 :(得分:2)
命名空间污染很像一般的污染。这意味着某些东西是错位的。在编程中,这意味着应该真正存在于单独命名空间中的代码被添加到公共命名空间(在某些情况下是全局命名空间)。静态和非静态代码都会发生这种情况,因此我并没有真正看到静态有助于防止名称空间污染的情况。
基本上,名称空间的主要功能是对代码进行分类,静态代码和非静态代码都必须在某个名称空间中定义。