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

sol*_*lti 1 c++

我有两个不同的文件algo1.halgo2.h.在他们里面我有匿名命名空间tolerance.

algo1.h

namespace algo {
namespace {
double tolerance = 1e-6;
}
void algo1() {
  //
}
}  // namespace algo
Run Code Online (Sandbox Code Playgroud)

alo2.h

namespace algo {
namespace {
double tolerance = 1e-6;
}
void algo2() {
  //
}
} // namespace algo
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "algo1.h"
#include "algo2.h"

int main() { algo::algo1(); }
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我得到错误

错误:重新定义'容差'

我以为匿名命名空间只驻留在一个翻译单元中.这就是匿名命名空间的重点.可能是我错过了什么.任何人都可以帮助知道我为什么会收到此错误?

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

M.M*_*M.M 5

未命名的命名空间的行为就像它具有该转换单元的唯一命名空间名称一样.因此,扩展#includes 后,main.cpp的翻译单元如下:

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

显然你已经定义了algo::unique_maincpp::tolerance两次.