命名空间 – 什么是命名空间污染?

“命名空间污染”一词的含义是什么?为什么静态方法有助于防止它?

This question似乎相似但与JavaScript有关,答案没有定义术语.

最佳答案
命名空间只是存在名称的空间(现在看起来很明显).

假设您有两段代码,一条用于处理链表,另一条用于处理树.现在,这两段代码都将受益于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中,将静态限定符应用于文件级对象或函数会给它内部链接.

它类似于C命名空间,因为你可以在400个不同的源文件中使用静态int get42(),它们不会相互干扰.

转载注明原文:命名空间 – 什么是命名空间污染? - 代码日志