是否可以将代码包装在匿名命名空间中以使用指令?

时间:2014-11-05 15:44:23

标签: c++

我希望using namespace std;能够在不污染全局命名空间的情况下应用于类和函数,但我想知道它是否可行。

namespace
{
    using namespace std;
    class S
    {
    public:
        S()
        {
            cout << "ok";
        }

        friend ostream operator<<(ostream& os, const S& s);
    };
}

对此有何警告?

4 个答案:

答案 0 :(得分:1)

它会起作用但请记住以下几点:

  • 您应该限制它在源文件中的使用,而不是在头文件中(一般you should refrain from using unnamed namespaces in headers),因为它们很容易弄乱你的符号定义,特别是如果有内联函数使用来自匿名命名空间)。

  • 这是一个不好的做法,只是因为懒惰而添加额外的命名层次结构层(即匿名命名空间)就像听起来一样糟糕。

答案 1 :(得分:0)

如果它在头文件中,那么它不是优选的,因为该文件可以包含在多个源文件中。如果在某个源文件中,那么它是可接受的

答案 2 :(得分:0)

不要仅仅因为您可以限制using指令的范围而决定使用匿名命名空间。

话虽如此,如果一个匿名(或任何其他)命名空间已经存在并且您希望其中包含using的优点,只要您的编码标准没问题就可以了。

答案 3 :(得分:0)

虽然这看起来像是一个很好的解决方案,但在我的实验中并没有像我预期的那样做。它不限制using指令的范围。

考虑一下:

#include <string>

namespace {

string s1; // compile error

}

namespace {

string s2; // compile error

}

string s3; // compile error

int main()
{
}

这些字符串都没有编译,因为它们没有经过适当的限定。这就是我们的期望。

然后考虑一下:

#include <string>

namespace {

using namespace std;

string s1; // compiles fine (as expected)

}

namespace {

string t2; // compiles fine (I didn't expect that)

}

string v3; // compiles fine (I didn't expect that either)

int main()
{
}

因此,在未命名的命名空间中放置using指令似乎与将其放在全局命名空间中完全相同。

编辑:实际上,将符号放在未命名的命名空间中会使其成为翻译单元的本地符号。所以这就是它无法达到预期目的的原因。

因此,标题必须是禁止。