我们可以在匿名命名空间中声明一个回调函数(从而赋予它内部链接),知道它将从另一个翻译单元(甚至是另一个库)调用吗?
一些lib:
void register_callback(void (*cb)())
{
..
cb();
..
}
主程序
namespace {
int foo_cb() { ... } // internal linkage
}
int main()
{
register_callback(foo_cb);
}
答案 0 :(得分:7)
TL; DR:是的,没关系
来自[basic.link](强调我的):
如果名称可能表示同一个对象,则称其为链接, 引用,函数,类型,模板,命名空间或值作为名称 由另一个范围内的声明引入:
- 当名称具有内部链接时,它表示的实体可以是 引用同一翻译单位中其他作用域的按名称。
[...]
- 醇>
未命名的命名空间或[...]具有内部链接。 [...]。具有未命名的命名空间范围的名称 上面给出的内部连接具有与封闭相同的连接 命名空间,如果它是
的名称
- 一个功能;或
所以基本上 links 是 names 的属性,而不是对象,函数等的属性。这意味着在未命名的命名空间内声明的函数不能被称为 by来自其他翻译单位的名称。用它的指针来调用它是没有限制的。