限制头文件中 "using namespace" 的作用域

11
我正在使用STL完成一个小型个人C ++项目。在我的头文件中,我不想到处都写"std :: ", 因为我发现这会影响可读性,但是同时我也不想通过将 using namespace std 放在头文件中而在以后引起问题。
因此,我想知道是否有一种方法可以限制 using 声明的范围,使其适用于我的头文件内容,但是不应该适用于包含它的文件。我尝试了各种类似以下的方法
{
    using namespace std;

    // header file contents here
}

但是似乎在函数定义之外以这种方式引入作用域是不允许的。是否有办法实现我想要的效果呢?

请注意:我真的不想讨论这是否是一个好主意,我只是想知道它是否能实现。


1
我的错误答案已被删除。抱歉。我总是习惯性地在头文件中(甚至现在在cpp文件中)完全限定名称。代码库声明自己的向量非常普遍,因此看到std::vector很有帮助,以避免歧义。但这并不能回答你的问题。 - M2tM
@M2tM 谢谢,没问题。 - N. Virgo
2个回答

5

是的,我认为可以做到。

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

头文件如下:

#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;
}

如果这个不符合您的要求,请告诉我。我们可以进行调整和修改。

4
注意,这可能会产生意想不到的后果。在头文件中的另一个命名空间内建立 using namespace blah; 可以有意地引入该命名空间中的 所有 内容,包括当前翻译单元中已经包含的内容,以及现在包括您的头文件,但不包括更远的内容。同样包含此头文件的另一个翻译单元可以使用所使用的命名空间中的声明和定义,而您的头文件并不知道这一事实。这是“using namespace”最理想的用法之一,通常在其他所有包含声明之后才建立。 - WhozCraig
我可能会采用这样的解决方案,但问题是它只会将皱纹推到另一个地方弹出。我的头文件代码很好地避免了 std::,但使用它的代码中却充斥着 my_space::。如果我使用 using namespace my_space,这将把所有东西从 std 导入到全局命名空间中,而这正是我们试图避免的。 - N. Virgo
我同意你的看法,Nathaniel。但是你必须在某个地方吞下苦果。 - Abhishek Mittal

3
不,这是不可能的。你试图在头文件中引入一个作用域,但失败了,因为头文件在编译过程中没有特殊的状态,也就不存在所谓的头文件作用域。翻译单元是在预处理器处理完源文件后得到的。因此,所有的include指令只是简单地展开相应的头文件。这样就防止你以任何方式使头文件内容与上下文相关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接