【问题标题】:Why passing the reference of a private function to an external one is working?为什么将私有函数的引用传递给外部函数是有效的?
【发布时间】:2017-04-03 22:29:16
【问题描述】:

我想知道传递一个不能正常调用的函数的引用是否安全(以及为什么)。

换句话说,在 myFunct.cpp 文件中,我有这样的内容:

#include "externalStuff.h"
#include "myFunct.h" // myFunct_publicFunction proto


static void myFunct_foo(void);
static void myFunct_foo(void)
{
  [...]
}


void myFunct_publicFunction()
{
  externalStuffObj.init(myFunct_foo);
}

在 externalStuff 内部,引用以这种方式关联:

externalStuffClass::init(void (*function)(void))
{
   externalStuffReference = function;
}

这段代码 sn-p 实际编译,当 externalStuffObj 以某种方式调用 myFunct_foo 的存储引用时,它会正确执行。 我认为在源文件中声明静态函数等同于在 C 中具有私有函数,因此不能被不包含在此类源文件中的函数使用。

我的问题是这是否安全,或者由于幸运因素而可以正常工作并且可能会弄乱指针。

【问题讨论】:

    标签: c++ function class reference private


    【解决方案1】:

    这是安全的,你可以用私有函数做同样的事情。 privatestatic 只限制对名称的访问,而不是函数本身。

    【讨论】:

      【解决方案2】:

      将函数声明为static 会影响其链接[basic.link/3]。在这种情况下,它只有内部链接(参见第二个项目符号here),这意味着链接器将无法从另一个翻译单元看到该函数。但是,这并不意味着您不能获取此类函数的地址并将其传递给另一个模块。

      这几乎类似于泄露私人成员:

      class MyClass{
          MyObject obj;
      public:
          MyObject* get(){ return &obj; }
      };
      

      这样做可能有合法和正当的理由;不过,这个机会也可能被滥用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-18
        • 2014-03-05
        • 2020-02-17
        • 2014-08-15
        • 1970-01-01
        • 2013-01-13
        • 2020-01-16
        • 2010-11-11
        相关资源
        最近更新 更多