限制头文件中“使用命名空间”的范围

Posted

技术标签:

【中文标题】限制头文件中“使用命名空间”的范围【英文标题】:Limiting the scope of "using namespace" in a header file 【发布时间】:2014-08-25 06:57:45 【问题描述】:

我正在开发一个使用 STL 的小型个人 C++ 项目。我不喜欢在我的头文件中到处都是“std::”,因为我发现它会妨碍可读性,但同时我不想在以后通过将using namespace std 放入头文件。

所以我想知道是否有办法限制using 声明的范围,使其适用于我的头文件的内容,但不适用于包括它。我尝试了各种类似的事情


    using namespace std;

    // header file contents here

但似乎不允许在函数定义之外以这种方式引入范围。有没有办法做我所追求的?

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

【问题讨论】:

我的错误答案已被删除。道歉。出于习惯,我总是完全限定标题中的名称(甚至现在在 cpp 文件中)。拥有声明自己的向量的代码库是很常见的,因此查看 std::vector 有助于避免歧义。不过,这无助于回答您的问题。 @M2tM 谢谢,没问题。 【参考方案1】:

不,不能这样做。您在标头中引入范围的尝试完全失败,因为没有标头范围之类的东西 - 头文件在编译期间没有特殊状态。翻译单元是预处理器完成后获得的源文件。因此,所有include 指令都只是扩展了相应的头文件。这可以防止您以任何方式使头文件的内容特定于上下文。

【讨论】:

【参考方案2】:

是的,我认为可以做到。

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

头文件如下:

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

如果这不能满足您的要求,请告诉我。我们可以解决这个问题。

【讨论】:

请注意,这可能会产生意想不到的后果。通过在头文件的另一个命名空间中建立using namespace blah;,您有意将 everything 拉入该命名空间中,该命名空间已包含在当前翻译单元中,现在包括 your 标头,但不是更进一步。包含相同标头的不同翻译单元可以在使用的名称空间中引入声明和定义,而标头(您的)完全不知道这一事实。这是using namspace 非常适合所有包含在 TU 之后建立的众多原因之一。 我可能会采用这样的解决方案,但问题是它会在一个地方压下皱纹,只是让它在另一个地方弹出。我的头文件代码很好地没有std::,但使用它的代码却充满了my_space::。如果我执行using namespace my_space,这会将std 中的所有内容导入全局命名空间,这是我们试图避免的。 我同意你的看法,纳撒尼尔。但你必须在一个地方或另一个地方吞下苦药。

以上是关于限制头文件中“使用命名空间”的范围的主要内容,如果未能解决你的问题,请参考以下文章

C++:命名空间——如何在头文件和源文件中正确使用?

C++ 仅头文件库避免“使用命名空间”污染

C++函数通过头文件分享给其他源文件时,使用命名空间方式,和使用类中静态函数方式,有何区别?

C++ 中命名空间别名的范围是啥?

如何使用命名空间和类?

命名空间的作用