通过来自另一个翻译单元的指针调用具有内部链接的函数

bol*_*lov 3 c++ function-pointers callback linkage

我们可以在匿名命名空间中声明一个回调函数(从而赋予它内部链接),知道它将从另一个翻译单元(甚至另一个库)调用吗?

一些lib:

void register_callback(void (*cb)())
{
  ..
  cb();
  ..
}
Run Code Online (Sandbox Code Playgroud)

主程序

namespace {
int foo_cb() { ... } // internal linkage
}

int main()
{
   register_callback(foo_cb);
}
Run Code Online (Sandbox Code Playgroud)

bol*_*lov 7

TL; DR:是的,没关系


来自[basic.link](强调我的):

  1. 当一个名称可能表示相同的对象,引用,函数,类型,模板,名称空间或值作为另一个范围内的声明引入的名称时,该名称被称为具有链接:

    • 当名称具有内部链接时,其表示的实体可以通过同一翻译单元中其他范围的名称来引用.
  2. [...]

  3. 未命名的命名空间或[...]具有内部链接.[...].具有名称空间作用域的名称上面没有给出内部链接,如果是名称,则具有与封闭名称空间相同的链接

    • 功能; 要么

所以基本上,链接名称的属性而不是对象,函数等的属性.这意味着在未命名的命名空间内声明的函数不能通过名称从另一个转换单元调用.用它的指针调用它是没有限制的.

  • 名称与对象的区别很好. (2认同)