我正在尝试使用 externs 与 C++ 中的 Ada 进行交互。这两种实现有什么区别?
实施方案A
namespace Ada
{
extern "C"
{
int getNumber();
int index;
int value;
}
}
实施B
namespace Ada
{
extern "C"
{
int getNumber();
}
extern "C" int index;
extern "C" int value;
}
两种实现都编译得很好。但 Impl-A 无法链接,我收到多重定义错误index and value。我只是想了解其中的差异。
extern“C”仅传达用于 extern“C”块内的代码的链接约定。该块中的任何内容都将被链接起来,就好像它是纯 c 一样。令人困惑的是, extern int 完全不同。这意味着你保证在某处有一个实际的 int 命名索引和一个实际的 int 命名值,但在这里找不到它们。在您的实现-A 中,整数实际上不是第二种意义上的外部 - 外部“C”仅意味着它们提供严格的 c 链接约定。
相同的关键字但完全不同的用途,这是不幸的,因为它会导致像这样的奇怪问题。混合它们是合法的(显然),但它们的行为方式并不像它们的名字所暗示的那样。
EDIT
请参阅 Charle 的回复,了解 C++ 标准中定义的 extern 怪异的真正定义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)