C と C++ のコードを一緒に混合する必要がある場合があります。たとえば、従来の C コードを使用している場合や、特定の C ライブラリを使用している場合、C++ コードに特定の機能が提供されます。そのため、C++ ファイルで C コードを使用する場合、またはその逆の場合は、いくつかの特別な手順に注意する必要があります。
この記事では、いくつかの例を通して、C/C++ コードを混在させるために必要な手順について説明します。
1. C++ から C 関数を呼び出す
このセクションでは、C++ コードから C 関数を呼び出す方法について説明します。
C コード (Cfile.c) は次のとおりです。
#include <stdio.h> void f(void) { printf("\n This is a C code\n"); }
最初のステップは、この C コードのライブラリを作成することです。次の手順で共有ライブラリを作成します:
$ gcc -c -Wall -Werror -fPIC Cfile.c $ gcc -shared -o libCfile.so Cfile.o
上記の 2 つのコマンドの結果として、共有ライブラリ libCfile.so が生成されます。
メインの C++ コード (main.cpp) は次のとおりです:
#include <iostream> extern "C" { void f(); } void func(void) { std::cout<<"\n being used within C++ code\n"; } int main(void) { f(); func(); return 0; }
C 関数 f() は表記法 extern “C” 内で宣言され、cpp コンパイラーに C 型リンケージがあることを伝えます。
次に、コードをコンパイルします (共有ライブラリ libCfile.so がコードにリンクされていることを確認してください):
$ g++ -L/home/himanshu/practice/ -Wall main.cpp -o main -lCfile
実行可能ファイルを実行する前に、共有ライブラリのパスが環境変数 LD_LIBRARY_PATH に含まれていることを確認してください。
$ export LD_LIBRARY_PATH=/home/himanshu/practice:$LD_LIBRARY_PATH
次に、実行可能ファイル「main」を実行します:
$ ./main This is a C code being used within C++ code
これで、C 関数が C++ コードから正常に呼び出されたことがわかります。
また、Linux で共有ライブラリを作成する方法の詳細については、こちらをお読みください。
2. C から C++ 関数を呼び出す
このセクションでは、C コードから C++ 関数を呼び出す方法について説明します。
C++ コード (CPPfile.cpp) は次のとおりです:
#include <iostream> void func(void) { std::cout<<"\n This is a C++ code\n"; }
関数 func() を C コードから呼び出す方法を見ていきます。
このための最初のステップは、表記 extern “C” を導入して、この関数の宣言/定義を変更することです。
#include <iostream> extern "C" void func(void) { std::cout<<"\n This is a C++ code\n"; }
次のステップは、上記のコードからライブラリを作成することです。次の手順で共有ライブラリを作成します:
g++ -c -Wall -Werror -fPIC CPPfile.cpp $ g++ -shared -o libCPPfile.so CPPfile.o
上記のコマンドにより、libCPPfile.so 共有ライブラリが生成されます。
C 言語のメイン コード (main.c) :
#include <stdio.h> extern void func(void); void f(void) { printf("\n being used within C code\n"); } int main(void) { func(); f(); return 0; }
ここでは、C++ 関数が extern として宣言されていることに注意してください。
次のように C コード (main.c) をコンパイルします。
gcc -L/home/himanshu/practice/ -Wall main.c -o main -lCPPfile
現在のディレクトリ パスを環境変数 LD_LIBRARY _PATH に追加します
export LD_LIBRARY_PATH=/home/himanshu/practice:$LD_LIBRARY_PATH
次に、実行可能ファイル「main」を実行します:
$ ./main This is a C++ code being used within C code
上記の出力は、C++ 関数が C コードから正常に呼び出されたことを示しています。