【问题标题】:Is it ok to wrap code in anonymous namespaces for using directives?可以在匿名命名空间中包装代码以使用指令吗?
【发布时间】:2015-01-01 21:08:12
【问题描述】:

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

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

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

对此有何注意事项?

【问题讨论】:

  • 只要它在您自己的源文件(不是标题)中,并且任何其他处理该文件的编码人员不介意,就可以。

标签: c++


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    不要为了限制using 指令的范围而决定使用匿名命名空间。

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

    【讨论】:

    • 你为什么大喊
    【解决方案3】:

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

    【讨论】:

    • @NeilKirk 你是什么意思?您可以在标头中使用匿名命名空间。
    • @NeilKirk 我了解到您也可以在标题中使用匿名命名空间。
    • 我的立场是正确的。他们是被允许的。虽然不是一个好主意,因为它会重复定义。
    【解决方案4】:

    虽然这看起来是一个很好的解决方案,但在我的实验中,它并没有达到我的预期。它不限制 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 指令似乎与将其放置在全局命名空间中完全相同。

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

    因此,它必须是标题的禁忌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-02
      • 2011-07-14
      • 2011-09-18
      • 2011-01-02
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多