什么是命名空间,为什么有必要

时间:2015-08-22 21:57:57

标签: c++ namespaces std

我现在正在学习C ++,在每个项目开始时,我的讲师都会说:

using namespace std;

据我所知,它使您不必调用包含头名称的头文件中的函数,如iostream :: stdout,而只需调用stdout。

但这条线究竟告诉C ++做什么。什么是命名空间,什么是std?

除了python,我也是编程新手,所以切换到新的范例对我来说非常困惑。

3 个答案:

答案 0 :(得分:11)

来自cppreference.com:

  

命名空间提供了一种防止名称冲突的方法   项目

     

在命名空间块内声明的符号放在命名范围内   这可以防止他们被误认为是同名的符号   在其他范围内。

     

允许使用多个具有相同名称的命名空间块。所有   这些块中的声明在命名范围内声明。

命名空间可以避免名称冲突,例如标准库定义sort(),但这对于排序函数来说是一个非常好的名称,多亏了命名空间,您可以定义自己的sort(),因为它赢了& #39;与标准名称相同的名称空间。

using指令告诉编译器在当前作用域中使用该命名空间,这样就可以执行

int f(){
    std::cout << "out!" << std::endl;
}

或:

int f(){
    using namespace std;
    cout << "out!" << endl;
}
当你从另一个命名空间中使用很多东西时,这很方便。

来源:Namespaces - cppreference.com

答案 1 :(得分:6)

  

但这条线究竟告诉C ++要做什么。什么是命名空间和   什么是标准?

std是一个命名空间。

命名空间是符号的集合。

该行告诉您的C ++编译器

a)搜索命名空间std的所包含部分(即iostream,iomanip),如果

b)它没有找到符号的定义(例如(std::) cout)

c)声明符号未知。

命名冲突解决(正如其他答案所述)可能是解决的最重要问题。

我最喜欢命名空间的是命名空间内容(类和函数)可以添加到多个头文件中。 (与一个必须完全在一个头文件中的类相比)。

因此,iostream,iomanip,string,stringstream各自独立地为std命名空间贡献类和代码。

因此,我可以将大多数工具保存在单独的文件中,然后将它们合并在逻辑上&#39;到一个名称空间。

例如:我在文件dtb_log.hh中有一个基于ram的固定大小日志,并且简要概述如下:

// Name:        dtb_log.hh
//
#ifndef DTB_LOG_HH
#define DTB_LOG_HH

namespace DTB  // <acronym description>
{    
   class Log
   {
   public:
       // ...

   }; // class Log

} // namespace DTB 

#endif // DTB_LOG_HH

我在文件dtb_mem_tag.hh中也有(很少使用,在这种情况下相关)实用程序

// Name:         dtb_mem_tag.hh
//
#ifndef DTB_MEM_TAG_HH
#define DTB_MEM_TAG_HH


namespace DTB    // <acronym name def>
{
   class MemTag
   {
   public:
   // ...
   };  // class MemTag

} // namespace DTB    

#endif // DTB_MEM_TAG_HH

使用DTB :: MemTag和DTB :: Log就像包含各自的#include头文件一样简单。

在使用这些内容的应用程序中,可以使用&#39; DTB ::&#39;清楚标记每种用法。前缀。

任何DTB代码&#39; evolution&#39;需要工作的是我的'dtb&#39;名称空间目录

因此,仅通过文件日期戳我就可以知道转换到ubuntu 64的位置对我的工具产生了影响。例如,我可以看到dtb_termselect.xx(用于arduino交互代码)已经更新,就像dtb_popen.xx,dtb_pause和其他几个一样。

在团队环境中(前一段时间),我们讨论了共享命名空间的各种方法。一般来说,这并不是很受欢迎......太难以达成一致意见。

但在讨论的想法中,使用命名空间作为贡献作者的签名的想法。因此创建了DTB(我的)和KTS(Ken的过渡服务)以及其他一些。不是每个人都对此感到兴奋。

答案 2 :(得分:2)

让我们从一个问题开始解释什么是命名空间。我们都知道,我们不能拥有具有相同名称的函数,类或任何其他类型的数据。让我们说我们有两个库都添加了一个函数,让我们说print()。它们都提供不同的功能,但在命名时它们是无法区分的。名称空间的来源。名称空间就像添加一个新的组名,您可以添加功能和其他数据,以便它可以区分。

namespace bla
{
  void print()
  {
    // function bla::print()
  }
}

namespace blabla
{
  void print()
  {
    // function blabla::print()
  }
}

现在,正如您所看到的,有两个名称为print的函数,但由于名称空间没有命名冲突。第一个函数将使用:bla :: print()调用,第二个函数使用blabla :: print()调用。

std是标准的缩写。 std是标准命名空间。 cout,cin和其他很多内容都在其中定义。 (这意味着调用它们的一种方法是使用std :: cout和std :: cin。)

使用技术手段的关键字,尽可能使用它。在这种情况下,这指的是std命名空间。因此,每当计算机遇到cout,cin,endl或其他任何问题时,它都会将其读作std :: cout,std :: cin或std :: endl。

当您不使用std命名空间时,计算机将尝试调用cout或cin,就像它没有在命名空间中定义一样(如代码中的大多数函数)。由于它不存在,计算机试图调用一些不存在的东西!因此,会发生错误。