这是典型的C ++代码:
foo.hpp
#pragma once
class Foo {
public:
void f();
void g();
...
};
foo.cpp
#include "foo.hpp"
namespace {
const int kUpperX = 111;
const int kAlternativeX = 222;
bool match(int x) {
return x < kUpperX || x == kAlternativeX;
}
} // namespace
void Foo::f() {
...
if (match(x)) return;
...
它看起来像一个不错的惯用C ++代码-一个类,一个辅助函数match
,由的方法使用Foo
,该辅助函数的一些常量。
然后我要编写测试。
为编写一个单独的单元测试将是完全合乎逻辑的match
,因为这是不平凡的。
但是它驻留在匿名名称空间中。
当然,我可以编写一个调用的测试Foo::f()
。但是,如果测试Foo
过于繁琐,将不是一个很好的测试,这种测试不会将受测者与其他无关因素隔离开。
因此,我必须将match
所有其他内容移出匿名名称空间。
问题:将函数和常量放入匿名名称空间有什么意义(如果它使它们在测试中不可用)?
friend
不建议为此目的滥用关键字。如果对方法的限制导致无法再直接测试它的情况,则意味着私有方法无用。
foo.cpp
,而不是标题中!OP似乎非常了解您不应在标题中放置匿名命名空间。