C から C++ を呼び出す

C Kara C Wo Hubi Chusu



プログラミングでは、古いコードを更新したり、さまざまな言語のモジュールを組み合わせたりするときに、C と C++ を連携させる必要がよくあります。 C プログラムで C++ コードを使用すると、特に古いソフトウェアを更新したり、両方の言語で記述された部分を混合したりする場合に、プログラマにとって非常に役立ちます。このガイドでは、C++ 関数を C で動作させる方法を、簡単で便利な例とともに説明します。 C プログラムから C++ を呼び出すのは難しいように思えるかもしれませんが、この記事ではすべてを段階的に説明しているので、簡単に理解して 2 つの言語を一緒に使い始めることができます。このガイドは、プログラミングの知識のレベルに関係なく、プロジェクトに役立ちます。

基本を理解する

C から C++ 関数を呼び出したり、C++ オブジェクトを使用したりする場合、いくつかの重要な要素を考慮する必要があります。

C での C++ クラスの参照

C で C++ クラスを参照する一般的なアプローチには、C と C++ コード間で受け渡すことができるクラスへのポインターを使用することが含まれます。







名前マングル

C での認識に影響を与える可能性のある名前の変更を防ぐには、名前の一貫性を保つことが重要です。これにより、C が関数とオブジェクトを正しく識別して利用できるようになります。



二重目的のヘッダー ファイル

ヘッダー ファイルは極めて重要な役割を果たし、C と C++ の両方で 2 つの目的を果たします。これには、C++ で認識できるクラス定義が含まれており、C のアクセサー関数がカプセル化されています。



C から C++ を呼び出す方法

C から C++ 関数を呼び出すには、extern 'C' 宣言が重要です。 C++ 関数に適用すると、コンパイル プロセス中に関数名が C スタイル (C リンケージを使用) で扱われることが保証されます。 C は、C++ のコンパイル中に発生する可能性のある関数のオーバーロードや名前のマングリングなどの C++ 機能を認識しません。 C++ コンパイラは extern 'C' を使用して C の規約に準拠した関数名を生成し、シームレスな相互運用性を実現します。この宣言は標準化されたインターフェイスを提供し、名前の競合や互換性の問題が発生することなく、C コードが C++ 関数にアクセスして利用できるようにします。以下は、C から C++ を呼び出す例です。この組み合わせがどのように機能するかを理解するために、インスタンスを詳しく見てみましょう。





実践例: C から C++ を呼び出して円の面積を計算する

この簡単な例では、C で C++ 関数を呼び出して円の面積を計算する方法を説明します。このコードは、ヘッダー ファイル (circle.h) と実装ファイル (circle.cpp) で構成されます。コードの最初の部分には、ヘッダー ファイル内の extern C 宣言が含まれます。次のコードを参照してください。次に、コードの各行を個別に詳しく説明します。

#ifndef CIRCLE_AREA
#CIRCLE_AREA を定義

外部 「C」 {

ダブル 計算_CArea ( ダブル ラッド ) ;

}

#endif

ダブル サークル_Cエリア ( ダブル ラッド ) {

戻る 3.14159 * ラッド * ラッド ;

}

各部分を詳しく見てみましょう:



#ifndef CIRCLE_AREA および #define CIRCLE_AREA

これらの行は、ヘッダー ファイルの内容がコンパイル プロセスで 1 回だけインクルードされることを保証するインクルード ガードの一部です。 CIRCLE_AREA が定義されていない場合は、後続のコードがインクルードされ、CIRCLE_AREA が定義されます。

外部 「C」

この構文は、次の関数に C リンケージがあることを宣言するために使用されます。これは、C と C++ の両方から呼び出されるコードを作成する場合に不可欠です。

ダブル 計算_CArea ( ダブル ラッド ) ;

この行は、double 引数 (rad) を受け取り、double を返す「calculate_Carea」という名前の関数を宣言します。

ヘッダー ファイル内の extern 'C' 宣言は、関数に C スタイルのリンケージを使用するようにコンパイラーに通知し、関数を C コードから呼び出せるようにします。このコードを使用して、「circle.h」ファイルに保存することで円の面積を見つけます。このヘッダー ファイルを保存したら、これをヘッダー ファイルとして C++ プログラムに組み込み、必要な機能を実行するだけです。以下は、円の面積を計算する C コードです。 「main.c」ファイルには C++ ヘッダーが含まれており、「Circle_Carea」を直接呼び出します。次のコードを参照してください。

#include 'circle.h'

整数 主要 ( ) {

ダブル ラッド = 5.0 ;

ダブル エリア = サークル_Cエリア ( ラッド ) ;

プリントフ ( 「円の面積は %.2f です」 \n エリア ) ;

戻る 0 ;

}

この単純な C プログラムは、「circle.h」という名前の前のファイルで定義されている関数を使用して円の面積を計算し、出力します。コードを分解してみましょう:

#include 'circle.h'

この行には、プログラム内の「circle.h」ヘッダー ファイルの内容が含まれています。ヘッダー ファイルには、円計算に関連する関数宣言またはマクロが含まれている可能性があります。

整数 主要 ( ) {

プログラムの実行は、C プログラムのエントリ ポイントである main 関数から始まります。

ダブル ラッド = 5.0 ;

double 型の変数 rads が宣言され、値 5.0 が割り当てられます。この変数はおそらく円の半径を表します。

ダブル エリア = サークル_Cエリア ( ラッド ) ;

半径 rads を引数として「Circle_Carea」という関数を呼び出し、結果を変数 area に格納します。

プリントフ ( '円の面積は: %.2f \n エリア ) ;

結果は「printf」を使用してコンソールに出力されます。 「円の面積は次のとおりです: %.2f\n」という文字列は、面積値の「%f」プレースホルダを含む書式文字列です。 「%.2f」の「.2」は、小数点以下 2 桁のみを表示することを指定します。

戻る 0 ;

main 関数は、プログラムの実行が成功したことを示す 0 をオペレーティング システムに返して終了します。

要約すると、ヘッダー ファイルは C リンケージを使用した関数を宣言し、実装ファイルは円の面積を計算するロジックを定義します。この分離により、コードを C プログラムと C++ プログラムの両方で使用できるようになります。次の図に示されているコードの出力を参照してください。

出力からわかるように、計算された円の面積は 78.54 です。これは、面積 = 3.14*5*5 = 78.54 の計算です。面積を計算する関数は「circle.h」ヘッダー ファイルで定義され、extern 「C」を使用して C++ ファイルで呼び出されます。

結論

このガイドでは、C++ を C プログラムに統合するプロセスについて説明しました。 C++ の機能を C コードベースに統合するには、ポインター、名前のマングリング、および二重目的のヘッダー ファイルについて慎重に検討する必要があります。提供された例は、この統合を達成するための実際的なアプローチを示しています。これら 2 つのプログラミング言語を接続する方法を理解したので、ツールはさらに増えました。 C を操作しながら C++ のパワーを活用することで、プロジェクトにまったく新しいレベルの機能を提供できる可能性があります。