如何限制对当前文件的某些功能或对象的访问?

Posted

技术标签:

【中文标题】如何限制对当前文件的某些功能或对象的访问?【英文标题】:How to restrict access to certain functions or objects to current file? 【发布时间】:2012-07-31 18:06:23 【问题描述】:

我想知道是否可以限制对在命名空间中声明的某些函数或对象的访问,仅限于同一文件中的其他类。例如,

//myheader.h

namespace stuff

  int repair(firstObj obj);
  int doSomethingElse();
  privateObj obj;

在这种情况下,我希望函数 doSomethingElse() 和对象 obj 只能被此文件中声明的类访问。

有什么关键字可以用来限制访问吗?

【问题讨论】:

这很有意义(考虑一个 pimpl idiom 或 private helper 函数)并且可以使用匿名命名空间。 【参考方案1】:

使用未命名的命名空间:

namespace stuff


  int repair(firstObj obj);

  namespace 
  
    int doSomethingElse();
    privateObj obj;
  


来自here [强调我的]:

未命名的命名空间是变量静态声明的更好替代品。 它们允许变量和函数在整个翻译单元内可见,但在外部不可见。虽然实体在 未命名的命名空间可能具有外部链接,它们实际上是 由其翻译单元独有的名称限定,因此可以 永远不会从任何其他翻译单位看到。

另请参阅此相关问题:Unnamed/anonymous namespaces vs. static functions


编辑:刚刚注意到这是我们正在谈论的头文件:

在这种情况下,我希望函数 doSomethingElse() 和对象 obj 只能被此文件中声明的类访问。

那么你不应该首先在公共头文件中声明这些方法和对象,而应该在具体的实现文件中:如果其他人不使用它们,其他人甚至不应该知道它们存在。

然后然后使用未命名的命名空间来有效地限制可达性(例如,如果有人会不小心使用相同的标识符提供另一个声明)。

如果您将它留在头文件中,可能会发生这种情况:anonymous namespaces and the one definition rule(如果头文件包含在多个翻译单元中):

【讨论】:

但我不会把它放在标题中,就像 OP 似乎想要的那样。 那么如果你想在一个只有标题的库中限制访问,你别无选择? @jiggunjer 我认为在这种情况下常用的方法是使用命名空间来代替。最好是其名称清楚地表明您不应以 API 用户身份访问它。诚然,这只是混淆,没有实际限制。 我创建了一个只有私有方法的 util 类,然后从我的文件中添加了朋友。【参考方案2】:

您可以使用关键字static

namespace stuff

 int repair(firstObj obj)
 static int doSomethingElse();
 static privateObj obj;

因此对象和函数只能在当前文件中访问。

【讨论】:

根据 C++03,附件 D.2:在命名空间范围内声明对象时不推荐使用 static 关键字 这句话被从C++11标准中去掉了,所以现在官方又可以了。【参考方案3】:

将它们声明为static 这意味着它们只能在该文件中访问。

【讨论】:

根据 C++11,现在不推荐使用 static 关键字。人们意识到 C 永远不会删除这种用法,因此 C++ 也必须保留它。 您可以在 c++ 中使用文件外部的静态函数。【参考方案4】:

是的,把它放在一个匿名命名空间中:

namespace stuff

    int repair(firstObj obj)

    namespace
    
        int doSomethingElse();
        privateObj obj;
    

【讨论】:

以上是关于如何限制对当前文件的某些功能或对象的访问?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4 身份验证。限制对资源的某些功能的访问,但不是全部

IOS 限制对某些国家或 WLAN 的应用程序的访问

为啥我的手机设置通用里面没有访问权限这个功能

使用 FolderBrowserDialog 限制对某些文件夹的访问

基于SDN的访问控制模块实现

基于SDN的访问控制模块实现