代码之家  ›  专栏  ›  技术社区  ›  solti

为什么匿名名称空间会给出重新定义错误?

c++
  •  1
  • solti  · 技术社区  · 6 年前

    我有两个不同的文件 algo1.h algo2.h . 在它们里面,我有一个匿名的名称空间 tolerance .

    算法1.h

    namespace algo {
    namespace {
    double tolerance = 1e-6;
    }
    void algo1() {
      //
    }
    }  // namespace algo
    

    alo2.h

    namespace algo {
    namespace {
    double tolerance = 1e-6;
    }
    void algo2() {
      //
    }
    } // namespace algo
    

    main.cpp

    #include "algo1.h"
    #include "algo2.h"
    
    int main() { algo::algo1(); }
    

    当我试图编译时,我得到了一个错误

    我认为匿名名称空间只存在于一个翻译单元中。这就是匿名名称空间的全部要点。也许我错过了什么。有人能帮我知道为什么我会犯这个错误吗?

    也有一些好的选择设计,我可以宣布宽容的所有 namespace algo .

    1 回复  |  直到 6 年前
        1
  •  5
  •   M.M    6 年前

    未命名名称空间的行为就好像它具有该转换单元的唯一名称空间名称一样。因此,main.cpp的翻译单元在扩展了 #include

    namespace algo {
        namespace unique_maincpp {
            double tolerance = 1e-6;
        }
        void algo1() {
          //
        }
    }  // namespace algo
    
    namespace algo {
        namespace unique_maincpp {
            double tolerance = 1e-6;
        }
        void algo2() {
        }
    } // namespace algo
    
    int main() { algo::algo1(); }
    

    很明显,你已经定义了 algo::unique_maincpp::tolerance 两次