我有两个不同的文件algo1.h
和algo2.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
上声明公差。
答案 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
。