术语“命名空间污染”是什么意思,为什么使方法静态有助于防止它?

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/

10-16 10:13