extern「C」の使用

コンテンツ

前書き

1.C++プログラムがCライブラリを呼び出す

2.CプログラムがC++ライブラリを呼び出す


前書き

  C ++プロジェクトでは、Cスタイルに従って一部の関数をコンパイルし、関数の前にextern "C"を追加する必要がある場合があります。これは、C言語の規則に従って関数をコンパイルするようにコンパイラーに指示することを意味します。例:tcmallocはGoogleによってC ++で実装されたプロジェクトです。使用するためにtcmallc()とtcfreeの2つのインターフェイスを提供しますが、Cプロジェクトの場合は使用できないため、extern"C"を使用して解決します。 。

1.C++プログラムがCライブラリを呼び出す

ここでは、例としてスタックのOJを取り上げます。LeetCode.20有効ブラケット、ここでは、C言語で記述された静的ライブラリのスタックを使用して便利に呼び出すことができます。

 1.最初に、トピックのメイン関数といくつかのインターフェイス関数をC++プロジェクトファイルtest.cppに配置します。

 以下に示すように:

2.スタックをCの静的ライブラリにします(C ++内の関数を直接呼び出すことができるように)

 ①最初に新しいプロジェクトを作成し(ここで使用するコンパイラはVS2019です)、Windowsデスクトップウィザードを選択します(静的ライブラリを選択することもできます)

 ②新しいプロジェクトを設定する

 ③静的ライブラリを選択し、プロジェクトを空にします

 ④以前にC言語で記述されたスタックのインターフェース機能をライブラリにコピーする

 ⑤サフィックスが.libのライブラリを生成します

 3.次に、test.cppでライブラリのヘッダーファイルを呼び出します

 ここで、「../」は前のレイヤーのファイルを返すことを意味します

#include "../Stack1/Stack.h"

その後、レポートの赤い警告が削除されたことがわかります。この方法でヘッダーファイルを宣言します。これは、これらの関数があることをコンパイラに通知するのと同じです。再度コンパイルしてリンクし、「未解決の外部関数」を見つけます。 "。また、リンクするためにいくつかの構成を行う必要があります。

 4.次に、C++プロジェクトのプロパティを構成します

①追加のライブラリディレクトリ(Stack1の下のデバッグファイル)

デバッグ内のStack1.libライブラリを追加のライブラリディレクトリに配置します。つまり、作成したStack1のデバッグパスを追加のライブラリディレクトリにコピーします。

 ②追加の依存関係(ライブラリをリンク)Stack1.lib;先頭に追加します。セミコロンは失われないことに注意してください

 5.次に、extern "C"を使用し、test.cppの前に追加します。

extern "C"
{
#include"../Stack1/Stack.h"
}

最後にコンパイルして実行します

 通話は成功しました!

2.CプログラムがC++ライブラリを呼び出す

 Cプログラムを作成し、C ++ライブラリを呼び出す必要がある場合は、extern"C"も必要です。

1.test.cファイルに使用するmain関数とinterface関数を入れます

 2.スタックをC++の静的ライブラリにします(上記と同じプロセス)

 同じコンパイルで、接尾辞.libのファイルが生成されます

3.構成プロパティ、追加のライブラリディレクトリ、および追加の依存関係(ここでは繰り返されません)

コンパイルしてリンクすると、再度リンクできないことがわかります

4.extern"C"が便利です

ここでのextern"C"は、C ++静的ライブラリプロセス関数をC関数名変更ルールで作成し、Cファイルがこれらの関数を認識してスムーズに呼び出すことができるようにするためのものです。 

条件付きコンパイルの方法を使用して、このように変更できます。C++ライブラリに、C関数名の変更ルールを使用して関数を装飾させ、.libを生成することができます。

#ifdef __cplusplus
extern "C"
{
#endif

	//初始化栈
	void StackInit(Stack* ps);

	//销毁栈
	void StackDestroy(Stack* ps);

	void StackPush(Stack* ps, STDataType x);

	void StackPop(Stack* ps);

	//当前栈的大小
	int StackSize(Stack* ps);

	//获取栈顶元素
	STDataType StackTop(Stack* ps);

	//栈是否为空
	bool StackEmpty(Stack* ps);

#ifdef __cplusplus
}
#endif 

最後に、コンパイル、リンク、実行し、接尾辞がtest.cであることを確認します。これは、CがC++を正常に呼び出したことを証明します。 

正常に実行してください!

これはextern「C」の使用法です、ありがとう!

おすすめ

転載: blog.csdn.net/weixin_57675461/article/details/121876001