就编程语言而言,C++ 和 C 享有特别好的链接时间关系。用任何一种语言编写的函数都可以从另一种语言的代码中调用(只要所有代码都使用一致的工具链编译),并且两种语言共享一组“含义相同”的通用基本类型。
为了说明,考虑一个简单的库函数foo 接受一个整数并返回一个整数。首先,我们可以编写一个对两种语言都有效的头文件:
lib.h:
#ifndef H_FOO
#define H_FOO
#ifdef __cplusplus
extern "C" {
#endif
int foo(int);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // H_FOO
接下来,我们可以提供实现这个功能的C代码:
lib_impl.c:
#include "foo.h"
int foo(int a) { /* ... */ };
最后,我们可以在 C++ 中使用这个库了:
app.cpp:
#include "foo.h"
struct XYZ {
XYZ(int n) : data_(foo(n)) {}
private:
int data_;
};
int main() { XYZ(10); }
在链接时,app.cpp 翻译单元中的外部符号 foo 可以与 lib_impl.c 翻译单元中导出的符号 foo 匹配,即使它们是从不同的语言编译而来的。 int 类型在两种语言中都表示“相同”,因为在 C++ 中调用具有值 10 的函数会导致正确的调用,就像 C 代码使用参数 10 调用函数一样——类型 @987654332 @ 在两种语言中的表示方式相同,调用约定也相同。
C 和 C++ 的这一基本方面不是任何正式标准的一部分,但实际上普遍适用,它是核心兼容性功能之一,它允许新的 C++ 程序在大量现有代码的基础上进行构建,并进行交互“本机”与许多操作系统 API(通常作为 C API 提供)。
许多工具链提供了类似的链接时互操作性,目标代码用汇编语言编写(您需要密切注意相关的调用约定),Fortran 也很常见(尽管您需要匹配 C 和具有 Fortran 类型的 C++ 基本类型)。其他较新的语言也可能提供与 C 的“直接”互链接性(因此,以一种迂回的方式,与 C++ 和 Fortran),否则它们可能需要一个库更重的“外来函数接口”,即关于它如何指定外语(例如 Java 和 Go)提供的函数的方式更加冗长。