我注意到在C++中,命名空间很少使用,而在.NET中很常见。这是有特别原因吗?
另外,我想知道其他人是否看到命名空间在C++中被广泛使用。
编辑:实际上,我指的是自定义应用程序,而不是标准库(如STL或任何其他东西)。
我注意到在C++中,命名空间很少使用,而在.NET中很常见。这是有特别原因吗?
另外,我想知道其他人是否看到命名空间在C++中被广泛使用。
编辑:实际上,我指的是自定义应用程序,而不是标准库(如STL或任何其他东西)。
在C++语言中,命名空间是在初始实现之后一段时间才添加的,因此有很多应用程序代码并没有使用它们。因此,由于它们的晚加入,所有标准库都被放入了一个命名空间中。因此,通过简单的using namespace std;
,如果您想要的话就可以忽略命名空间。
另一方面,在C#中,命名空间从一开始就很重要,并且库被分成了许多命名空间。此外,每个人都使用的创建初始代码的向导会默认将类放入一个命名空间中。这迫使人们更加注意命名空间。
C++中的命名空间与.Net、ActionScript和Java(共享相同概念)中的命名空间完全不同。它们根本不是相同的概念。
在C++中,命名空间主要用于允许将多个类型和函数封装在一个命名上下文中,即命名空间。它仅涉及命名和访问名称。
在.Net、ActionScript和Java中,命名空间更多地涉及模块而不是名称。它们强制开发人员将代码组织在单独的命名空间中,每个命名空间都与一个目的、上下文有关。由于这些语言是动态的(而不是像C++一样静态),命名空间允许类型向代码进行后期绑定,使编译速度快,因为您只需要在文件中使用类型的规范名称(命名空间+名称)。
在C++中,没有模块概念,只有互相不知道的编译单元。
现在谈到它们的使用,通常最好在C++中使用命名空间来封装模块(可执行文件或dll/so)、一些实现代码或任何有用的子代码部分。话虽如此,大多数情况下最好不要有太深的命名空间层次结构。由于历史原因,很多C++开发人员很长时间以来甚至不知道C++有一个名为命名空间的特性。现在我们所谓的“现代C++”建议您了解它,但是很多旧的C++代码今天仍在使用,也许这就是您在谈论命名空间时看到的内容。
C++中的命名空间是与其他语言不同的功能,这也使得它在代码中的编写更或多或少明显。事实上,它是如此不同,以至于您将无法完全以相同的方式管理它,这使得代码在从.Net等语言转换过来时真的很难理解。因此,您不应该在不同的语言之间以相同的方式考虑命名空间,它们是真正不同的概念。
nm -DC /usr/lib/libQtCore.so
,并查找了不在全局命名空间中的名称。没有发现这样的名称,对于libQtGui.so
和libQtNetwork.so
也是如此。这不是我所谓的“广泛使用”。实际上,Qt API仅包含很少的命名空间,而且这些命名空间通常是次要的领域,还有一些命名空间是实现细节。 - jpalecekQTextBox
和qSort
(请注意Q纯旧前缀半命名空间)这样的名称污染时。 - jpalecekQTextBox
应该改为QTextEdit
。 - jpalecek最简单的答案是,当你在Visual Studio(2003及以上版本)中启动程序时,默认会创建命名空间
。其他(旧的)IDE可能没有这个功能。
.NET从一开始就推广了它。命名空间并不总是C ++原始实现的一部分,但它在.NET中得到了推广。
从我在5个不同的地方工作的经验来看,加入之前有2个使用了命名空间。
我猜C++中命名空间没有被广泛使用(应该是因为)语法很笨拙。
例如:我想写这个:
namespace xml::xmpp::core { }
但实际上必须写成这样:
namespace xml { namespace xmpp { namespace core { } } }
而且为了前向声明,我想写成这样:
class xml::parser;
但必须写成这样:
namespace xml { class parser; }
但我可以这样写:
using namespace xml::xmpp::core;
稍微说一下,有人能告诉我为什么类必须以分号结尾,而其他任何东西(函数、命名空间)都不需要吗?
命名空间是你在大型项目中的好朋友!
看过或没看过-都无所谓。拥抱使用它们的习惯。