首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >隐藏内联命名空间标头中的私有常量

隐藏内联命名空间标头中的私有常量
EN

Stack Overflow用户
提问于 2010-01-18 02:49:03
回答 3查看 16.3K关注 0票数 30

我有一些内联函数包含在头文件的名称空间中,目前还不能将它们移到cpp文件中。其中一些内联函数使用魔术常量,例如:

代码语言:javascript
运行
复制
// Foo.h
namespace Foo
{
    const int BAR = 1234;

    inline void someFunc()
    {
        // Do something with BAR
    }
}

然而,我想让这些神奇的常量成为私有的--你知道怎么做吗?我的第一个想法是使用匿名名称空间,例如:

代码语言:javascript
运行
复制
// 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文件的情况下完成此操作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-18 02:53:58

您不能这样做,匿名名称空间适用于定义它们的翻译单元(或者在您的例子中包含在其中)。

您可以考虑将它们移到detail名称空间中,以告知用户它们是内部详细信息:

代码语言:javascript
运行
复制
namespace foo {
    namespace detail {
        int magic = 42;
    }

    // ... use detail::magic
}
票数 33
EN

Stack Overflow用户

发布于 2010-01-18 02:55:40

这样如何:

代码语言:javascript
运行
复制
namespace Foo {
    class foo_detail {
    private:
        enum {
            BAR = 1234,
        };

        friend void someFunc();
    };

    inline
    void someFunc() {
        // something with foo_detail::BAR
    }
}

这使得除了您标记为好友的函数之外,其他任何人都无法访问该常量。您可以通过将构造函数设为私有来确保没有人尝试实例化该类,从而使该类不可构造。

票数 18
EN

Stack Overflow用户

发布于 2010-01-18 02:55:36

将它们放在一个特殊的名称空间中,或者对它们进行特殊的命名,并结合项目约定,即这些内容是非公共的:

代码语言:javascript
运行
复制
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的唯一名称。他们在这里帮不上忙。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2082156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档