限制「;使用名称空间";在头文件中 我正在使用STL做一个小型的个人C++项目。我不喜欢头文件中到处都是“std::”,因为我发现这会妨碍可读性,但同时我不想在头文件中放置using namespace std,从而在以后给自己带来问题

限制「;使用名称空间";在头文件中 我正在使用STL做一个小型的个人C++项目。我不喜欢头文件中到处都是“std::”,因为我发现这会妨碍可读性,但同时我不想在头文件中放置using namespace std,从而在以后给自己带来问题,c++,namespaces,scope,C++,Namespaces,Scope,因此,我想知道是否有一种方法可以使用声明来限制的范围,使其适用于头文件的内容,但不适用于包含它的文件。我试过各种各样的方法 { using namespace std; // header file contents here } 但是,在函数定义之外,似乎不允许以这种方式引入作用域。有没有办法做到我想要的 请注意:我真的不想讨论这是否是一个好主意,我只是想知道是否可以做到。是的,我认为可以做到 为了实现这一点,您需要构建自己的名称空间。 我已经写了一些代码,这是按照预期的工

因此,我想知道是否有一种方法可以使用声明来限制
的范围,使其适用于头文件的内容,但不适用于包含它的文件。我试过各种各样的方法

{
    using namespace std;

    // header file contents here
}
但是,在函数定义之外,似乎不允许以这种方式引入作用域。有没有办法做到我想要的


请注意:我真的不想讨论这是否是一个好主意,我只是想知道是否可以做到。

是的,我认为可以做到

为了实现这一点,您需要构建自己的名称空间。 我已经写了一些代码,这是按照预期的工作

头文件看起来像:

#include <iostream>
namespace my_space {
    using namespace std;

    void mprint ()
    {
        /*
         * This is working. It means we can access
         * std namespace inside my_space.
        */
        cout << "AAA" << endl; 
    }
};
#include "my_header.h"

int main ()
{

    /*
     * Working Fine.
    */
    my_space::mprint();

    /*
     * It gives a compile time error because
     * it can't access the std namespace
    */
    cout << "CHECK" << endl;
    return 0;
}
#包括
名称空间my_空间{
使用名称空间std;
无效打印()
{
/*
*这起作用了,这意味着我们可以访问
*我的空间中的std名称空间。
*/

cout否,无法执行此操作。您尝试在标头中引入作用域失败的原因正是因为不存在标头作用域-标头文件在编译过程中没有特殊状态。翻译单元是在预处理器使用它之后获得的源文件。因此,所有
include
指令只需pand相应的头文件。这将阻止您以任何方式使头文件上下文的内容特定。

我的错误答案已被删除。抱歉。我始终完全限定头文件中的名称(甚至现在在cpp文件中)出于习惯。代码基声明自己的向量是很常见的,因此查看std::vector有助于避免歧义。但这无助于回答您的问题。@M2tM谢谢,没问题。请注意,这可能会产生意外的后果。通过在头文件您有意引入该名称空间中的所有内容,这些内容在当前翻译单元中包括到,现在包括您的头,但不包括更进一步的内容。包含相同头的不同翻译单元可以将所用名称空间中的声明和定义与头一起引入(您的)完全没有意识到这一事实。这是使用namspace的许多原因之一。毕竟,namspace非常适合在TU中建立Include。我可能会选择这样的解决方案,但问题是,它在一个地方压下皱纹,只会在另一个地方弹出。我的头文件代码很好地没有
std:
,但使用它的代码中充满了
my_space::
。如果我使用
名称空间my_space
,这会将
std
中的所有内容导入全局名称空间,这正是我们试图避免的。我同意你的看法,Nathaniel。但你必须在某个地方吞下苦果。