在C +加

时间:2016-12-13 09:57:23

标签: c++

考虑一下

#include<headerfile1>
#include<headerfile2>
.
.
#include<headerfilen>
using namespace std;

当我写这个(头文件都在C ++的标准库中)时,所有头文件的std命名空间是否都会出现?

此外,如果有两个库h1和h2,并且两个库具有相同的命名空间x,并且在这些命名空间中具有相同的函数func()。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

来自cppreference

  

隐含地命名内联命名空间的using-directive   插入封闭的命名空间(类似于隐式   using-directive用于未命名的命名空间。)

例如,在以下示例中,using namespace std::string_literals使操作符在范围内可见:

{ // in C++14, std::literals and its member namespaces are inline
   using namespace std::string_literals; // makes visible operator""s 
                                         // from std::literals::string_literals
   auto str = "abc"s;
}

如果你在范围之外使用using指令(例如在你的例子中),那么就会像评论者所说的那样痛苦,特别是如果这个文件是一个头文件:这个命名空间将被隐式导入到任何包含此文件的文件。这就是管理大项目的正确方法是创建自己的命名空间并将所有自定义对象放在新命名空间中的原因。如果你真的必须使用using指令,请在实现文件中执行,不要在头文件中,最好在范围内。 这将帮助您避免大多数冲突,除非您的命名空间使用通用名称:

namespace Matrix{ <--- Bad practice, Matrix will probably conflict with something
myStuff ...
}

namespace JohnsAwesomeMatrix236790{ <--- Namespace name is unique,unlikely to get conflicts.
myStuff ... 
}

此外,导入您使用的少数函数而不是整个命名空间更安全:

using namespace std; // Imports the entire namespace!

using std::cout;     // Much better, we only import
using std::endl;     // the names of the two functions we use a lot

你所包含的任何体面的书都会非常谨慎地使用using指令(如果有的话),所以你通常不必担心这个问题。但是,如果您使用不太严格的标准(例如科学代码)编写的代码,则需要注意这一点。