gpt4 book ai didi

namespaces - 什么是命名空间污染?

转载 作者:行者123 更新时间:2023-12-04 13:32:19 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com