术语“命名空间污染”是什么意思,为什么使方法静态有助于防止它?
This question 似乎很相似,但具体与 JavaScript 相关,答案并未定义该术语。
最佳答案
命名空间只是名称存在的空间(现在看起来已经很明显了)。
假设您有两段代码,一段用于处理链表,另一段用于处理树。现在这两段代码都将受益于 getNext()
函数,以帮助遍历数据结构。
但是,如果它们都使用相同的名称定义该函数,则可能会发生冲突。当您输入以下代码时,您的编译器会做什么?
xyzzy = getNext (xyzzy);
换句话说,您实际上想使用哪个
getNext()
?有很多方法可以解决这个问题,例如使用面向对象的代码,您可以使用:xyzzy = xyzzy.getNext();
由于您已经通过变量
xyzzy
本身指定了类型,这将自动神奇地选择正确的类型。但是,即使大部分是面向对象的代码,也可能会出现冲突的情况,这就是命名空间进入画面的地方。它们允许您将名称放在它们自己的区域中以便区分它们。
例如,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++ 命名空间,因为您可以在四百个不同的源文件中拥有
static int get42()
,并且它们不会相互干扰。关于namespaces - 什么是命名空间污染?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22903542/