C / C ++プログラミングに混合

まず、C ++ C混合プログラミングの導入前に/最初のいくつかの質問を考え

何1. C / C ++プログラミング混在こと?

2. C / C ++プログラミング混在使用することは何ですか?

3. C / C ++プログラミング混合は達成するためにどのようにすべきですか?

次に、C / C ++混合プログラミングの私の理解についての簡単な話:

何1. C / C ++プログラミング混在こと?

問題自体は前記のように、C / C ++プログラミングは、C ++メソッドの機能は、C関数を呼び出すことができるC関数法ではC ++関数を呼び出す、混合したプロジェクトです。

2. C / C ++プログラミング混在使用することは何ですか?

日々の開発では、このようないくつかの例が発生した同僚A、C、信じられないほど多作が、C ++について何も知らないことがあり、同僚B、Cは便利になる++が、Cは、彼の頭の霧を持っていますが、そのような種類が仕事であります。需要が、同僚はこれを行う方法を、B方式の同僚が使用する必要があり、C ++、Cのメソッドを使用する必要がありますか?

はい、最も簡単なのは同僚の書き込み、その後、単に同僚はちょうどBのC ++コードの書かれた同僚、その職務を呼び出し、作業効率を向上させ、同僚B、共感を呼び出すためにCコードを入れて、です。

3. C / C ++プログラミング混合は達成するためにどのようにすべきですか?

さて、このハイブリッドプログラミングはどのようにどのようにそれを達成するには?

導入前に、我々は簡単に次の概念を理解します

1.関数のオーバーロード
2. C ++名の適応メカニズム
3. EXTERNとはextern "C"

*関数のオーバーロード(  過負荷  )

C ++とJavaは、同じの関数定義をオーバーロードされました

以下に示すように、すなわち、同じスコープ内で、C ++は、同じ名前で複数の機能を可能にするが、異なるパラメータリスト:

関数のオーバーロード

C ++は関数のオーバーロードをサポートしており、なぜあなたが今まで疑問に思っている場合は、Cはそれをオーバーロードする機能をサポートしていませんか?

これは、メカニズムのC ++名前の符号化を伴うだろうにお読みください。 -

* C ++名前適応メカニズム

Cでは、

空テスト();関数名が_testに書き換えられた後、//コンパイラは、関数をコンパイルします

試験C言語()関数

_testと呼ばれるC言語コンパイラの名前の変更()関数をテストします

PS:利用できませんテスト()関数で、我々はテスト()関数の真の顔を見ることができるように、時にXcodeのリンクエラーを実現することです!

無効テスト(A INT); //この関数はコンパイラコンパイラは、関数名はまだ_testで書き換えを行ったあと

C言語のテスト(int型)機能

名前を変更したC言語コンパイラをテスト(int型)関数は、まだ_testと呼ばれています

C ++では、

空テスト(); //は、パーサジェネレータの関数名の後に機能テストを書き換えます()

C ++コンパイラの名前の変更()関数はテスト(と呼ばれるテスト)

無効テスト(int型A);この関数は、コンパイルされた//関数名がコンパイラのテスト(int)を書き換えられた後、

C ++テスト(int型)と呼ばれるコンパイラと改名(INT)機能をテスト

PS:一部のシステムコンパイラは、名前の適応メカニズムが唯一のアイデアではなく、グローバルに一意の命名規則は、異なるコンパイラが命名異なる仕様が、以下に示すと同じ考えです_test_intにこの形式をコンパイル! :

異なるコンパイラによって生成関数名は異なる場合があります

この記事では、私たちが実践的な成果を試し、その後、自分自身の過負荷をさらにいくつかの機能を試すことができ、これらのいくつかの例を引用します。練習は王であります!

上記のいくつかの例では、私はC ++はCがオーバーロードをサポートしていませんオーバーロードをサポートしていますなぜ我々は簡単に知ることができると信じています。

C ++の名前は何のメカニズムCが存在しないので、マングリング!

だから、Cには、限り、同じ関数名として、関係なく、あなたのパラメータリストの極離れて、コンパイラの両方があいまいな機能につながると同じ関数名、としてそれをコンパイルすることはのために、(プログラム実行中されて呼び出します同じ関数名を機能し、プログラムが許可されていない、)を呼び出すように機能している知っているので、エラーはありません。

しかし、C ++の用語のために、彼らは同じ関数名を持っているにもかかわらず、しかし、それらの異なるパラメータリストのコンパイルコンパイラは、実際にそのプログラムが機能していない2を呼び出すときに、それらの異なる名前の関数として変更されます曖昧さは、そのC ++は関数のオーバーロードすることができます。

多型は、メソッドの動的バインディング実行時にあるので、別にここで、C ++オーバーロードが考慮されていない多型を引き、およびC ++の関数は、コンパイル時間が「多型」であることを、最大のオーバーロード。(この文ではありません必ずしも正しい、修正してください)

*はexternを及externを "C"

EXTERNは、グローバル変数のスコープ、一般的に関数を宣言するために使用され、我々はよりよく知っていると信じています。にexternがコンパイラに伝え、関数と変数は、この文書または他のファイルにその規定のために使用することができる。ここではそれらを繰り返すことはしません。

C内でextern「C」それは何を意味するのでしょうか?

ここでCのC言語は、言語を指すのではなく、法律やリンクをコンパイルしない。Cは、Fortranの(式変換)、アセンブラ(アセンブリ言語)等の法令と、任意の言語の接続にC言語コンパイラのコンプライアンスを表し。

注意:

extern「C」CでC ++の構文の仕様に従う必要があり、作成する方法を、書く方法を提出する必要があり++だから、コンパイルを指定し、法令をリンクし、セマンティクスには影響しません。

ステートメントC ++ソースファイルプラスにextern「C」の役割の前にクラスCとリンクの規程に従ったコードのコンパイルとリンクのこの部分をコンパイルするコンパイラを伝えることです(はい、つまり、クラスCコンパイラ命名規則の関数として)

ヒント:複数のステートメントが必要な場合にextern「C」は、例えば、{}内に封入されてもよいです。

extern "C" 使い方

どのようにC / C ++混合プログラミング、それを達成するためにはextern「C」を使用する必要がありますか?

1. C ++コードC呼び出し
2 C ++コードの呼び出しC 
3 C / C ++相互

* CはC ++コードを呼び出すために

騒ぎ、コードに。

C C ++定義されたコールの合計(int型、int型)機能

間違いなく、このコードを介して連結され、そしてその理由ではないですか?

Cでは、関数をコンパイルします。合計は、しかし、はるかにそこにファイルが合計合計の関数(int型、int型)、コンパイラのリンクとしてコンパイルされたC ++で書かれ、コンパイラ_sumの主な機能を呼び出しますエラーが_sum機能次の図を見つけることができません報告されます

未定義関数_sum

ソリューションは、ちょうどOKにコンパイルとリンクのようにCとC ++ファイル内の法令機能を確認して、明確です!

この時間にextern「C」は、それをデビューします!

この時点では、cppのファイル機能ではextern「C」{}でのみ必要図のように、文書を含み、Cに呼び出す必要があります。

正常にコンパイル、正しい出力

* C ++ Cを呼び出すコード

C、C ++は、合計を呼び出す(int型、int型)機能

また、コンパイラの機能へのリンクが見つかりません機能のための別の命名規則につながるので、

extern「C」ともにファイルを.Cために、すでにコンパイルおよび法令のCを結ぶ続くCファイルのほかに、Cファイルで使用することはできませんので、この時点で、我々は、C、C ++の方法で問題を解決するために呼び出す前にようにすることはできません助けないにextern「C」を使用します。

このとき、以下の図において、無傷のCPYの#include「zs.h」にヘッダーファイルで宣言されたC関数に等しい既知の#include、テキストコピーの#include同等の役割に関連します。

#含める

関数宣言は、C ++ファイルにコピーされているので、何人かの友人は、あなたが唯一この関数の宣言コードC ++ファイルをコンパイルし、コンパイル済みのクラスCに基づいてリンクされていることを確認する必要があり、と思うかもしれない、法律は合計をコンパイル保証できるリンク一貫性のあるファイル関数などのC関数名!

だから、次のような方法がありました

やりました!

気配りの友人が、見つけるの#include同等のテキストコピーするので、なぜそこにヘッダファイルにはextern「C」文を入れていないのだろうか?

さて、私たちは〜してみてください

確かに、成功を実行しています

しかし、私はあなたがそうするならば、Cメソッドが呼び出されるCファイルを提出しないことを教えてくれて申し訳ありません!

Cコンパイラをextern「C」構文をサポートしていませんので!

これは、限りC ++ファイルとして、マクロ、__cplusplusにつながり、コンパイラが自動的にこのようなマクロを定義します、我々はC / C ++究極の混ざっ行うには、このマクロを使用することができます!

C C関数呼び出し成功

C ++ Cの関数呼び出し成功

概要

/ C ++の関数を呼び出すことができますCを書き込むには、(C言語はC ++をサポートしていないため、およびC ++は、C / C ++をサポートしている)、それは、Cコンパイラの方法に従わなければなりません

以下に示すように、C / C ++プログラミングの混合を達成するために、単にヘッダファイルに数行のコードを追加し、非常に簡単です

C / C ++の混合プログラミングコアコード

あなたはC / C ++プログラミングが似ているとC / OC / C ++プログラミング混合を達成する必要がある場合は興味深いことに、C言語でのObjective-Cコンパイラの機能の命名規則は、見ることができます。

おすすめ

転載: blog.csdn.net/Abelia/article/details/93770748