C++とCは、プログラミング言語が行なわれる限り、特に優れたリンク時の関係を享受します。いずれかの言語で書かれた関数は、(すべてのコードが一貫したツールチェーンでコンパイルされていれば)他の言語のコードから呼び出すことができ、2つの言語は「同じ意味」の共通の基本型を共有します。
説明のために、単純なライブラリ関数foo
を考えて、整数を返し、整数を返します。まず、我々は両方の言語で有効なヘッダファイルを書くことができます。
lib.h:
lib_impl:
#ifndef H_FOO
#define H_FOO
#ifdef __cplusplus
extern "C" {
#endif
int foo(int);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // H_FOO
次へ]を、私たちはこの機能を実装するCコードを提供することができます.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でもよくありますFortranの型を持つC++基本型)。もっと最近の言語は、C言語との直接的な相互接続性(C++やFortranのようなラウンドアバウト)を提供する可能性があります。それはどのように外国語(例えば、JavaやGoのような)によって提供される関数を指名するかについてより冗長です。