C++ 外部/多重定义

2024-01-03

我正在尝试使用 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(使用前将#替换为@)

C++ 外部/多重定义 的相关文章

随机推荐