链接规范
该术语 “链接规范”是指链接不同的语言 (或程序) 协议编写的功能。下面的调用约定会受到影响:
名称区分大小写。
名称修饰。在 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 关键字的详细信息。)