命名空间污染是什么?

loc*_*ock 6 namespaces

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

这个问题看起来很相似,但具体与JavaScript有关,答案并没有定义这个术语.

pax*_*blo 11

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

假设您有两段代码,一条用于处理链表,另一条用于处理树.现在,这两段代码都将受益于getNext()函数,以帮助遍历数据结构.

但是,如果它们定义了具有相同名称的函数,则可能会发生冲突.输入以下代码时,编译器会做什么?

xyzzy = getNext (xyzzy);
Run Code Online (Sandbox Code Playgroud)

换句话说,getNext()你真的想用哪个?有很多方法可以解决这个问题,例如使用面向对象的代码,您可以使用以下方法:

xyzzy = xyzzy.getNext();
Run Code Online (Sandbox Code Playgroud)

并且这将通过您通过变量xyzzy本身指定类型的事实自动选择正确的.

但是,即使使用大多数OO代码,也可能存在冲突的情况,这就是命名空间进入图片的位置.它们允许您将名称放在它们自己的区域中以区分它们.

作为一个例子,C++将其所有标准库内容放入std命名空间.如果由于某种原因,您需要的函数fopen()rand()函数与库中的函数不同,则可以将它放在您自己的命名空间中以使它们分开.

现在描述命名空间冲突.从技术上讲,名称空间污染只是将符号留在名称空间中,而它们本身并不应该存在.这并不一定会导致冲突,但它更有可能发生冲突.


使方法静态(在类C语言中)的原因与给定翻译单元之外的世界可用的名称有关(例如,当链接时).随着代码:

int get42 (void) { return 42; }
int main (void) { return get42(); }
Run Code Online (Sandbox Code Playgroud)

这两个函数都可供链接器使用.

除非您需要get42()从其他地方打电话,否则请将其设为静态:

static int get42 (void) { return 42; }
int main (void) { return get42(); }
Run Code Online (Sandbox Code Playgroud)

将阻止它污染链接器维护的命名空间 - 在C中,将static限定符应用于文件级对象或函数赋予它内部链接.

它类似于C++命名空间,因为您可以拥有static int get42()四百个不同的源文件,它们不会相互干扰.