我们是否可以在匿名命名空间中声明一个回调函数(从而为其提供内部链接),并知道它将从另一个翻译单元(甚至另一个库)调用?
一些库:
void register_callback(void (*cb)())
{
..
cb();
..
}
主程序
namespace {
int foo_cb() { ... } // internal linkage
}
int main()
{
register_callback(foo_cb);
}
TL;DR:是的,没关系
来自[basic.link](强调我的):
-
A name据说有linkage当它可能表示同一个对象时,
引用、函数、类型、模板、命名空间或值作为名称
由另一个作用域中的声明引入:
- 当一个名字有内部联系,它所表示的实体可以是
提到by names来自同一翻译单元中的其他范围。
[...]
-
未命名的命名空间或 [...] 具有内部链接。 [...]。具有尚未被命名空间范围的名称
上面给定的内部链接与封闭的链接具有相同的链接
命名空间(如果它是名称)
所以基本上linkage是一个属性names而不是对象、函数等。这意味着无法调用在未命名命名空间内声明的函数by name来自另一个翻译单位。通过它的指针调用它没有任何限制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)