为什么将私有函数的引用传递给外部函数是有效的?

Why passing the reference of a private function to an external one is working?

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

换句话说,在文件 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;
}

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

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

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

将函数声明为 static 会影响其链接 [basic.link/3]. In this case, it has only internal linkage (see the second bullet here),这意味着链接器将无法从另一个翻译单元看到该函数。但是,这并不意味着您不能获取此类函数的地址并将其传递给另一个模块。

这几乎类似于泄漏私有成员:

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

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