就編程語言而言,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
調用該函數一樣 - int
類型的表示方式相同,並且兩種語言的調用約定都是相同的。
C和C++的這個基本方面不是任何形式標準的一部分,但是實際上是普遍真實的,它是核心兼容性特性之一,它允許新的C++程序基於大量現有代碼進行構建,以及交互「本地」與許多操作系統API(通常提供爲C API)。
許多工具鏈提供了類似的鏈接時間互操作性,其中彙編代碼中寫入了目標代碼(需要密切關注相關調用約定),Fortran也很常見(儘管您需要匹配C和Fortran類型的C++基本類型)。其他更新的語言也可以提供與C的「直接」互連性(因此,以迂迴的方式,用C++和Fortran),否則它們可能需要更多的庫重「外部函數接口」,這是一種有關它如何提名由外語提供的功能(例如Java和Go)的詳細信息。