【发布时间】:2014-04-07 04:19:36
【问题描述】:
术语“命名空间污染”是什么意思?为什么将方法设为静态有助于防止它?
This question 似乎很相似,但具体与 JavaScript 相关,答案并没有定义该术语。
【问题讨论】:
标签: namespaces
术语“命名空间污染”是什么意思?为什么将方法设为静态有助于防止它?
This question 似乎很相似,但具体与 JavaScript 相关,答案并没有定义该术语。
【问题讨论】:
标签: namespaces
命名空间只是名称存在的空间(现在看起来很明显)。
假设您有两段代码,一段处理链表,另一段处理树。现在这两段代码都将受益于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(),并且它们不会相互干扰。
【讨论】:
命名空间污染很像一般的污染。这意味着有些东西放错了地方。在编程中,这意味着应该将真正存在于单独命名空间中的代码添加到公共命名空间(在某些情况下是全局命名空间)。静态代码和非静态代码都可能发生这种情况,因此我并没有真正看到静态有助于防止命名空间污染的场景。
基本上,命名空间的主要功能是对代码进行分类,静态和非静态代码都必须在命名空间的某个地方定义。
【讨论】: