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

时间:2019-02-03 03:36:31

标签: c++

我有两个不同的文件algo1.halgo2.h。在它们内部,我有tolerance的匿名名称空间。

algo1.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 个答案:

答案 0 :(得分:5)

未命名的名称空间的行为就像该转换单元具有唯一的名称空间名称一样。因此,对于main.cpp中翻译单元,向外扩展后的#include S,是这样的:

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