限制头文件中"using namespace"的范围

Nat*_*iel 8 c++ scope namespaces

我正在使用STL开发一个小型的个人C++项目.我不喜欢std::在我的头文件中占有" ",因为我发现它阻碍了可读性,但同时我不想通过放入using namespace std头文件来引起自己的问题.

所以我想知道如果有一种方法来限制的范围内using声明,因此它适用于我的头文件的内容,但并不适用于包含它的文件.我试过这样的各种事情

{
    using namespace std;

    // header file contents here
}
Run Code Online (Sandbox Code Playgroud)

但似乎在函数定义之外不允许以这种方式引入范围.有没有办法做我想要的事情?

请注意:我真的不想讨论这是否是一个好主意,我只是想知道它是否可以完成.

小智 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; 
    }
};
Run Code Online (Sandbox Code Playgroud)

实现文件如下:

#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;
}
Run Code Online (Sandbox Code Playgroud)

如果这不符合您的要求,请告诉我.我们可以解决这个问题.

  • 请注意,这可能会产生意想不到的后果.通过在头文件中的另一个命名空间内建立一个`using namespace blah;`,你有意地将当前翻译单元中包含的*所有*中的*所有*拉入,现在包括*your*header,但不包括进一步.包含相同标题的不同翻译单元可以在使用的名称空间中引入声明和定义,标题(您的)完全不知道该事实.这是"使用namspace"的众多原因之一,非常适合在TU中包含所有内容之后建立*. (3认同)