C++ 将“using”指令限制到当前文件

C++ 将“using”指令限制到当前文件,c++,using-directives,C++,Using Directives,很抱歉提出这个愚蠢的问题,但是有没有办法将使用指令限制在当前文件中,这样它们就不会传播到包含该文件的文件中?没有,这就是为什么不应该在头文件中使用指令,或者您包含的任何其他文件。也许将要包含在其自己的命名空间中的代码包装起来可以实现该行为 您需要,因为名称空间具有作用域影响 // FILENAME is the file to be included namespace FILENAME_NS { using namespace std; namespace INNER_NS {

很抱歉提出这个愚蠢的问题,但是有没有办法将
使用
指令限制在当前文件中,这样它们就不会传播到包含该文件的文件中?

没有,这就是为什么不应该在头文件中使用指令,或者您包含的任何其他文件。

也许将要包含在其自己的命名空间中的代码包装起来可以实现该行为
您需要,因为名称空间具有作用域影响

// FILENAME is the file to be included
namespace FILENAME_NS {
   using namespace std;
   namespace INNER_NS {
      [wrapped code]
   }
}
using namespace FILENAME_NS::INNER_NS;
在其他文件中

#include <FILENAME>
// std namespace is not visible, only INNER_NS definitions and declarations
...
#包括
//std命名空间不可见,只有内部定义和声明
...

从技术上讲,您应该能够将它们导入某个内部名称空间,然后在该名称空间中声明的内容在为用户指定的名称空间中可见

#ifndef HEADER_HPP
#define HEADER_HPP

#include <string>

namespace my_detail
{
    using std::string;
    inline string concatenate(const string& a, const string& b) { return a + b; }   
}

namespace my_namespace
{
    using my_detail::concatenate;
}

#endif
\ifndef头\u水电站
#定义水电站的水头
#包括
名称空间my_详细信息
{
使用std::string;
内联字符串连接(常量字符串&a,常量字符串&b){返回a+b;}
}
名称空间my_名称空间
{
使用my_detail::concatenate;
}
#恩迪夫

#包括
#包括“header.hpp”
使用名称空间my_名称空间;
int main()
{
std:://必需
字符串a(“你好”),b(“世界!”);

std::我们可以稍微扩展一下它-预处理器(它处理
#include
和其他
#
-命令)在编译器看到代码之前运行。使用
指令的
和任何其他标准关键字都是由编译器处理的。因此,就编译器而言,头文件实际上不是单独的文件-它们是碰巧位于每个文件中的代码,它们是
\include
'd,因此任何
'd都是这样>使用
指令,你可能会把它们放进去。啊……悲哀。无论如何,谢谢你的回答。@Rahul没那么糟糕-你可以(也应该)这样做当然,在.cpp文件中使用
using
指令。不过,您可以将指令的使用限制在非文件范围内,例如命名空间或函数。最好不要在标题中使用
using
指令。@David:当我可以键入
map
时,我讨厌键入类似
std::map
的内容。我太麻烦了ndeed。但仍然是一个很好的工作。所以,+1:)嘿,很酷的把戏!我想我会选择这一个;非常感谢!:)
#include <iostream>
#include "header.hpp"

using namespace my_namespace;

int main() 
{
    std::  //required
    string a("Hello "), b("world!");
    std::cout << concatenate(a, b) << '\n';
}