CコードコールのC関數(shù)をエクスポートするには、名前の変更を防ぐためにextern "c"を使用する必要があります。 1. extern "c"を使用して、cソースファイルに関數(shù)をラップします。 2. cとcと互換性のあるヘッダーファイルを作成し、#ifdef __cplusplus條件を介してパッケージextern "c"宣言をコンパイルします。 3。共有ライブラリとしてコンパイル:Linux/MacosはG -FPIC -sharedを使用して生成します。 4. Cプログラムにヘッダーファイルを含め、関數(shù)を呼び出し、コンパイル時(shí)間に共有ライブラリをリンクします。注:Cクラス、テンプレート、または過(guò)負(fù)荷機(jī)能をエクスポートすることはできません。オブジェクトの動(dòng)作が必要な場(chǎng)合は、不透明なポインターと工場(chǎng)関數(shù)を使用してカプセル化できます。最終的に生成されたライブラリは、cで正常に呼び出すことができます。これは、C-Cの相互運(yùn)用性を?qū)g裝する標(biāo)準(zhǔn)的な方法です。
C関數(shù)をエクスポートしてCコード(たとえば、共有ライブラリまたはDLLで)から呼び出すことができる場(chǎng)合、関數(shù)がCリンケージを使用してC名のマングリングを防ぐ必要があります。これはextern "C"
を使用して行われます。

CがC関數(shù)を適切にエクスポートする方法を示す実用的な例を示します。
?1。extern extern "C"
を使用してC関數(shù)をエクスポートする
Cから使用できるCライブラリを書(shū)いているとします。Cで機(jī)能を定義しますが、それらをextern "C"
にラップしてCリンケージを與えるとします。

mathlib.cpp
(cソース)
// mathlib.cpp extern "c" { //これらの関數(shù)にはCリンケージがあり、cから呼び出すことができます double add(double a、double b){ ABを返します。 } ダブルマルチ(ダブルA、ダブルB){ a * bを返します。 } //文字列を返す必要がある場(chǎng)合(注意:メモリ管理) const char* greet(){ "Hello from C!"を返します。 } }
?注:
extern "C"
リンクを使用した関數(shù)のみは、Cから直接使用可能です。クラス、テンプレート、extern "C"
を介して過(guò)負(fù)荷機(jī)能などのC機(jī)能をエクスポートすることはできません。
?2。C互換性のヘッダーファイル
CとCの両方で機(jī)能するヘッダーを作成します。

mathlib.h
#ifndef mathlib_h #define mathlib_h #ifdef __cplusplus extern "c" { #endif double add(double a、double b); ダブルマルチ(ダブルA、ダブルB); const char* greet(); #ifdef __cplusplus } #endif #endif // mathlib_h
-
#ifdef __cplusplus
コードがcとしてコンパイルされているかどうかを確認(rèn)します。その場(chǎng)合、それはextern "C"
の関數(shù)宣言を包みます。 - このヘッダーは、CファイルとCファイルの両方に安全に含めることができます。
?3。共有ライブラリとしてコンパイルします
Linux/macosについて:
g -fpic -hared mathlib.cpp -o libmathlib.so
Windows(g /mingwを使用):
g -shared mathlib.cpp -o mathlib.dll
これにより、c調(diào)整可能な機(jī)能を備えた共有ライブラリが作成されます。
?4。cからライブラリを使用します
test.c
(CプログラムCライブラリを消費(fèi))
// test.c #include <stdio.h> #include "mathlib.h" int main(){ printf( "add(3.14、2.86)=%f \ n"、add(3.14、2.86)); printf( "乗算(4、5)=%f \ n"、乗算(4、5)); printf( "Greet:%s \ n"、Greet()); 0を返します。 }
コンパイルとリンク:
gcc test.c -l。 -lmathlib -oテスト
libmathlib.so
(または.dll
)が現(xiàn)在のディレクトリまたはシステムパスにあることを確認(rèn)してください。
?ヒント:Linuxで
LD_LIBRARY_PATH
使用するか、Windowsで実行するために.dll
を配置します。
??制限とメモ
extern "C"
ことはできません(Cは過(guò)負(fù)荷をサポートしません)。- Cクラス、方法、またはテンプレートをCに直接さらすことはできません。
- オブジェクトのような動(dòng)作が必要な場(chǎng)合は、不透明なポイントと工場(chǎng)関數(shù)を使用します。
// Cで:Cインターフェイスの背後にあるクラスインスタンスを管理する クラス計(jì)算機(jī){ 公共: 二重値; 電卓(double v):value(v){} void add(double v){value = v; } }; extern "c" { calculator* calc_create(double initial){ 新しい計(jì)算機(jī)(初期)を返します。 } void calc_add(calculator* calc、double v){ if(calc)calc-> add(v); } double calc_get_value(calculator* calc){ 計(jì)算を返しますか? calc-> value:0; } void calc_destroy(calculator* calc){ Calcを削除します。 } }
次に、これらの関數(shù)をCリンケージでヘッダー內(nèi)に公開(kāi)します。
?概要
cの関數(shù)を輸出するには:
-
.cpp
ファイルのextern "C"
のラップ関數(shù)定義。 - Cの互換性には、
extern "C"
ガードを備えたヘッダーを使用します。 - 共有ライブラリにコンパイルします。
- 標(biāo)準(zhǔn)Cリンクを使用してCコードからのリンク。
このパターンは、Python(Cpython)、SQLite、OS APIなどのライブラリで広く使用されています。
基本的に、 extern "C"
はCからCまでの橋です
以上がC消費(fèi)の例のcエクスポート機(jī)能の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫(huà)像を無(wú)料で

Undresser.AI Undress
リアルなヌード寫(xiě)真を作成する AI 搭載アプリ

AI Clothes Remover
寫(xiě)真から衣服を削除するオンライン AI ツール。

Stock Market GPT
AIを活用した投資調(diào)査により賢明な意思決定を?qū)g現(xiàn)

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版
中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

installac compilerlikegを使用して、packagemanagordedordementtoolsdependingontheos.2.writeac andsaveitwitha.cppextension.3.compiletheprogramusingg hello.cpp-ohellotogenerateanexecutable.4.runtheexecutable

カスタムアロケーターを使用して、Cコンテナのメモリ割り當(dāng)て挙動(dòng)を制御できます。 1.例のログインガロカーターは、オーバーロードをオーバーロードすることにより、メモリ操作を?qū)g裝します。 2。アロケーターは、STLコンテナタイプの変換要件を満たすために、value_typeを定義し、テンプレートを再構(gòu)築する必要があります。 3.アロケーターは、建設(shè)とコピー中にログ出力をトリガーします。これは、ライフサイクルの追跡に便利です。 4.実際のアプリケーションには、メモリプール、共有メモリ、デバッグツール、組み込みシステムが含まれます。 5。c 17以來(lái)、コンストラクトと破壊はdefaultでstd :: allocator_traitsによって処理できます

std :: system()関數(shù)を使用してシステムコマンドを?qū)g行します。システムコマンドは、ヘッダーファイルを含めてstd :: system( "ls-l")などのcスタイルの文字列コマンドに渡す必要があり、リターン値は-1です。つまり、コマンドプロセッサは使用できません。

cmakelists.txt、src/を含むプロジェクトディレクトリ構(gòu)造を作成します。 2。CMAKELISTS.TXTを書(shū)き込み、CMAKEバージョン、プロジェクト名、C標(biāo)準(zhǔn)を指定し、実行可能ファイルを追加します。 3. mkdirbuildを使用してディレクトリを入力し、cmake ..およびcmake - buildを?qū)g行します。編集用; 4. add_executableを介して複數(shù)のソースファイルを追加し、ターゲット_include_directoriesを使用してヘッダーファイルパスを含めます。 5。Find_Packageを使用して外部ライブラリを見(jiàn)つけ、ターゲット_link_librariesにリンクします。 6。

Cのスタックは、STLのコンテナアダプターです。バックインファーストアウトの原則に従い、ヘッダーファイルを含める必要があります。プッシュで要素を追加し、ポップが上部要素を削除し、上部がスタックの上部にアクセスします。操作の前に、それが空であるかどうかを確認(rèn)します。これは、表現(xiàn)評(píng)価やバックトラッキングなどのシナリオでよく使用されます。

theautokeywordletsthecompilredededucevariabletypesfrominitializers、還元versを抑制し、誘惑性を促進(jìn)します

答えは、必要なタイプのエイリアスと操作を含むクラスを定義することです。まず、value_type、參照、ポインター、Difference_Type、およびIterator_categoryを設(shè)定し、その後、控除、増分、および比較操作を?qū)g裝します。最後に、容器內(nèi)のbegin()およびend()メソッドをiteratorインスタンスを返すように提供し、stlアルゴリズムとループの範(fàn)囲と互換性があります。

astaticvariableは、functioncallsandisializedonce.2.insideafunction.3.inaclass.3.inaclass、itissharedamongallinstances andmustded andmustdededeclastoavoidlinkinlinkers.4.statevaria.4.statevaria
