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()四百个不同的源文件,它们不会相互干扰.