链接规范

该术语 “链接规范”是指链接不同的语言 (或程序) 协议编写的功能。下面的调用约定会受到影响:

  • 名称区分大小写。

  • 名称修饰。在 C 中,编译器对名称前加上下划线。这通常称为 “修饰”。在 C++ 中,名称修饰用于通过连接阶段使类型信息。(请参见 修饰名)

  • 参数在堆栈期望的顺序。

  • 调整堆栈的职责函数返回。调用函数或调用函数是症结所。

  • 通过隐藏的参数 (任何隐藏的实参通过)。

extern string-literal { declaration-list }
extern string-literal declaration

链接规范实现逐渐添加 C 代码添加到 C++ 通过允许使用现有代码。

Microsoft 专用

Microsoft C++ 当前支持的唯一链接规范是 “C”“C++”

特定于 Microsoft 的结尾

下面的示例用 C 链接声明的函数 atoi 和 atol :

extern "C"
{
    int  atoi( char *string );
    long atol( char *string );
}

使用 C 链接,对这些函数执行。同一个结果可以在使用这两个声明:

extern "C" int  atoi( char *string );
extern "C" long atol( char *string );

Microsoft 专用

所有 Microsoft C 标准包含文件使用条件编译指令检测 C++ 生成。当检测到 c. C++ 生成,原型在 extern “C” 指令将如下所示:

// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif

// Function declarations

#if defined(__cplusplus)
}
#endif 

特定于 Microsoft 的结尾

您不需要声明一个标准的功能包括文件作为 extern “C”

如果重载函数,不超过一个具有相同名称的函数可以有链接说明符。(有关更多信息,请参见 函数重载、。)

下表显示各种链接规范的工作方式。

链接规范的效果

规范

效果

在对象

只影响该对象连接

在函数

影响在其中声明的函数和所有功能连接器或对象

在类

影响类中和对象声明的连接所有非成员函数

如果函数有多个链接规范,它们必须授予;它是声明函数的错误作为具有 C 和 C++ 连接。此外,因此,如果功能的两个声明在程序 (包括一个带有链接规范和一发生未 —将链接规范的声明必须是第一个。已有链接规范给定函数的所有多余声明在第一个声明中指定的连接。例如:

extern "C" int CFunc1();
...
int CFunc1();            // Redeclaration is benign; C linkage is
                         //  retained.

int CFunc2();
...
extern "C" int CFunc2(); // Error: not the first declaration of
                         //  CFunc2;  cannot contain linkage
                         //  specifier.

显式声明的函数和对象,当一种复合链接说明符中 () 的主体的 静态 视为静态函数或对象,链接说明符被忽略。其他函数和对象的行为,就象使用声明 extern 关键字。(请参见 使用外部指定连接 有关 extern 关键字的详细信息。)

请参见

参考

使用外部指定连接