C++外部/多个定义

Jer*_*unh 3 c++ extern

我试图使用externs在C++中与Ada连接.这两个实现有什么区别?

实施A.

namespace Ada
{
    extern "C"
    {
        int getNumber();
        int index;
        int value;
    }
}
Run Code Online (Sandbox Code Playgroud)

实施B.

namespace Ada
{
    extern "C"
    {
        int getNumber();
    }
    extern "C" int index;
    extern "C" int value;
}
Run Code Online (Sandbox Code Playgroud)

两种实现都编译得很好.但Impl-A无法链接,我得到索引的多重定义错误.我只是想了解这些差异.

Pet*_*ter 7

extern"C"仅传递用于extern"C"块内的代码的链接约定.该块中的任何内容都将被链接,就像它是纯粹的c一样.令人困惑的是,extern int完全不同.这意味着你保证在某处有一个实际的int命名索引和一个实际的int命名值,但是在这里找不到它们.在你的实现中 - 在第二种意义上,int实际上并不是extern - extern"C"只意味着它们提供了严格的c链接约定.

相同的关键字但完全不同的用途,这是不幸的,因为它会导致像这样的奇怪问题.混合它们是合法的(显然),但它们并不像它们的名字所暗示的那样表现出来.

编辑

请参阅Charle对C++标准中定义的外部怪异的真实定义的回应.


CB *_*ley 7

联动说明符(即extern "C"extern "C++")施加到声明的一支柱所附的序列对封闭声明是否定义或不是,但是一个没有效果联动说明符施加到单个声明被视为extern说明符,用于确定是否的目的声明也是一个定义.(C++ 03第7.5版)

所以:

extern "C" { int a; } // a is declared and defined

extern "C" int a; // a is just a declaration (as if extern int a;)

extern "C" int a = 0; // a is a definition because of the initializer.
Run Code Online (Sandbox Code Playgroud)