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

时间:2016-05-25 16:13:14

标签: c++ callback function-pointers linkage

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

一些lib:

void register_callback(void (*cb)())
{
  ..
  cb();
  ..
}

主程序

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

int main()
{
   register_callback(foo_cb);
}

1 个答案:

答案 0 :(得分:7)

TL; DR:是的,没关系

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

  
      
  1. 如果名称可能表示同一个对象,则称其为链接,   引用,函数,类型,模板,命名空间或值作为名称   由另一个范围内的声明引入:

         
        
    • 当名称具有内部链接时,它表示的实体可以是   引用同一翻译单位中其他作用域的按名称
    •   
  2.   
  3. [...]

  4.   
  5. 未命名的命名空间或[...]具有内部链接。 [...]。具有未命名的命名空间范围的名称   上面给出的内部连接具有与封闭相同的连接   命名空间,如果它是

    的名称      
        
    • 一个功能;或
    •   
  6.   

所以基本上 links names 的属性,而不是对象,函数等的属性。这意味着在未命名的命名空间内声明的函数不能被称为 by来自其他翻译单位的名称。用它的指针来调用它是没有限制的。