我有一些内联函数包含在头文件的名称空间中,目前还不能将它们移到cpp文件中。其中一些内联函数使用魔术常量,例如:
// Foo.h
namespace Foo
{
const int BAR = 1234;
inline void someFunc()
{
// Do something with BAR
}
}
然而,我想让这些神奇的常量成为私有的--你知道怎么做吗?我的第一个想法是使用匿名名称空间,例如:
// Foo.h
namespace Foo
{
namespace
{
// 'private' constants here
const int BAR = 1234;
}
inline void someFunc()
{
// Do something with BAR
}
}
但是,这不起作用,任何包含Foo.h
的cpp文件都可以使用Foo::BAR
?有没有一种方法可以在不创建实现cpp文件的情况下完成此操作?
发布于 2010-01-18 02:53:58
您不能这样做,匿名名称空间适用于定义它们的翻译单元(或者在您的例子中包含在其中)。
您可以考虑将它们移到detail
名称空间中,以告知用户它们是内部详细信息:
namespace foo {
namespace detail {
int magic = 42;
}
// ... use detail::magic
}
发布于 2010-01-18 02:55:40
这样如何:
namespace Foo {
class foo_detail {
private:
enum {
BAR = 1234,
};
friend void someFunc();
};
inline
void someFunc() {
// something with foo_detail::BAR
}
}
这使得除了您标记为好友的函数之外,其他任何人都无法访问该常量。您可以通过将构造函数设为私有来确保没有人尝试实例化该类,从而使该类不可构造。
发布于 2010-01-18 02:55:36
将它们放在一个特殊的名称空间中,或者对它们进行特殊的命名,并结合项目约定,即这些内容是非公共的:
namespace foo {
namespace detail { // as in "implementation details"
inline int answer() { return 42; }
const int perfect = 28;
}
std::string _question(); // not part of foo's "public interface" by convention
int this_is_public() {
using namespace detail; // now don't have to prefix detail::
return answer() + perfect + _question().length();
}
}
任何使用记录为非公共名称的人都将绕过您尝试的任何“保护”;这突出了真正的问题:记录公共接口的一部分并可能依赖的内容。
未命名的名称空间解决了一个不同的问题:获取特定TU的唯一名称。他们在这里帮不上忙。
https://stackoverflow.com/questions/2082156
复制相似问题