問題タブ [extern-c]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 簡単な言葉で extern "C" を使用するのはいつですか?
C と C++ の違いを理解していないかもしれませんが、いつ、なぜ使用する必要があるのでしょうか。
? どうやらそれは「リンケージ規約」です。
私はそれについて簡単に読んで、MSVS に含まれるすべての .h ヘッダー ファイルがコードを囲んでいることに気付きました。「C++コード」ではなく「Cコード」とは正確にはどのタイプのコードですか? C++ にはすべての C コードが含まれていると思いましたか?
これは事実ではなく、C++ は異なり、標準機能/関数はどちらか一方に存在するが両方には存在しない (つまり、printf は C で cout は C++) と推測していますが、C++ は後方互換性がありますが、 extern "C" 宣言。これは正しいです?
私の次の質問は最初の回答によって異なりますが、とにかくここで質問します: C で記述された MSVS ヘッダー ファイルは extern "C" { ... } で囲まれているため、いつこれを使用する必要がありますか?あなた自身のコードであなた自身?コードが C コードであり、C++ コンパイラでコンパイルしようとしている場合、問題なく動作するはずです。なぜなら、含めるすべての標準 h ファイルには、C++ コンパイラで extern "C" が既に含まれているからです。
C++ でコンパイルするときにこれを使用する必要がありますが、既にビルドされている C ライブラリなどにリンクしますか?
c++ - C++とCの組み合わせ-#ifdef__cplusplusはどのように機能しますか?
レガシーCコードがたくさんあるプロジェクトに取り組んでいます。最終的にレガシーコードも変換することを目的として、C++での記述を開始しました。CとC++がどのように相互作用するかについて少し混乱しています。Cコードをextern "C"
C++コンパイラでラップしても、 Cコードの名前が壊れないことは理解していますが、これを実装する方法が完全にはわかりません。
したがって、各Cヘッダーファイルの上部(インクルードガードの後)には、次のようになります。
一番下に、
2つの間に、インクルード、typedef、関数プロトタイプがすべてあります。これを正しく理解しているかどうかを確認するために、いくつか質問があります。
CヘッダーファイルBhを含み、別のCヘッダーファイルChを含むC ++ファイルA.hhがある場合、これはどのように機能しますか?コンパイラがBhにステップインすると、が定義されると思います。その
__cplusplus
ため、コードはでラップされますextern "C"
(__cplusplus
このブロック内では定義されません)。したがって、Chにステップインするとき、__cplusplus
は定義されず、コードはでラップされませんextern "C"
。これは正しいです?コードの一部をでラップすることに何か問題があり
extern "C" { extern "C" { .. } }
ますか?2番目は何をextern "C"
しますか?このラッパーを.cファイルの周りに配置するのではなく、.hファイルだけを配置します。では、関数にプロトタイプがない場合はどうなりますか?コンパイラはそれがC++関数だと思いますか?
また、 Cで記述されたサードパーティのコードを使用しており、このようなラッパーはありません。そのライブラリのヘッダーを含めるときはいつでも
extern "C"
、#includeを回避しています。これはそれに対処する正しい方法ですか?最後に、これは良いアイデアですか?他にやるべきことはありますか?近い将来、 CとC ++を混合する予定であり、すべてのベースをカバーしていることを確認したいと思います。
c++ - cのexternキーワード
コードで何度も次のようなステートメントを見てきました。
これは正確にはどういう意味ですか?
c++ - 名前や型が特定の言語リンケージを持つとはどういう意味ですか?
(c) ANSI ISO/IEC 14882:2003、127 ページによると:
リンケージ仕様のネスト。リンケージ仕様がネストすると、最も内側の仕様が言語を決定します。リンケージ仕様は有効範囲を確立しません。リンケージ仕様は、名前空間スコープ (3.3) でのみ発生するものとします。リンケージ仕様では、指定された言語リンケージは、宣言によって導入されたすべての関数宣言子、関数名、および変数名の関数型に適用されます。
これはどういう意味ですか?たとえば、f2()
関数にはどのようなリンケージがありますか? C または C++ 言語のリンケージですか?
@Johannes Schaub が指摘したように、これが標準で何を意味するかについての実際の説明はないため、異なるコンパイラでは異なる解釈が可能です。
オブジェクトファイルの違いを説明してください:
- C言語リンケージとC++言語リンケージを持つ関数の名前。
- C 言語リンケージおよび C++ 言語リンケージを持つ関数の型。
c++ - extern "C" はいつ使用するのですか?
使い方はわかったけど、使わextern "C"
なきゃいけない条件って何?
extern "C"
中括弧内のコードで名前マングリングを実行しないように C++ コンパイラに指示します。これにより、C++ 内から C 関数を呼び出すことができます。
例えば:
これはVC ++でうまくコンパイルされますが。しかし、時々これは次のように書かれます。
要点がわかりません。必要な場合の実際の例を挙げていただけますextern "C"
か?
c++ - extern "C" は C++ でどのように機能しますか?
extern "C"
次のように、ファイルの先頭で使用している C++ のコードがいくつかあります。
これは何を意味するのでしょうか?それはどのように機能しますか?
c++ - #ifdef __cplusplusなしでCファイルでextern"C"を使用できますか?
extern "C"
C関数として定義する必要のある関数に指定すべきではないのはなぜですか?ファイルをCソースとしてコンパイルすると、コンパイラにどのような影響がありますか?
Cコンパイラに影響がない場合は、#ifdef __cplusplus
チェックを外して、以下のようにヘッダーファイルに関数を定義するだけではいけませんか?
別の質問への回答は、が必要であると言ってい#ifdef
ますが、理由がわかりません。
#2に関して:__ cplusplusは、C++コンパイラーを介して実行されているすべてのコンパイル単位に対して定義されます。一般に、これは.cppファイルとその.cppファイルに含まれるすべてのファイルを意味します。同じ.h(または.hhまたは.hppまたはwhat-have-you)は、異なるコンパイル単位に含まれている場合、異なる時点でCまたはC++として解釈される可能性があります。.hファイル内のプロトタイプがCシンボル名を参照するようにする
extern "C"
場合は、C ++として解釈されるときに持つ必要があり、Cextern "C"
として解釈されるときに持つべきではありません。したがって、#ifdef __cplusplus
チェックします。
c++ - extern "C" 関数は別の型ですか?
C++11 ドラフト 7.5 (para. 1) から:
言語リンケージが異なる 2 つの関数型は、それ以外は同一であっても、別個の型です。
したがって、言語リンケージに基づいてオーバーロードを実行できます。
ただし、GCC 4.7.1 では、このサンプル コードでエラー メッセージが表示されます。
そして CLang++ で:
今質問:
標準に対する私の理解は正しいですか?このコードは有効ですか?
これらがコンパイラのバグなのか、それとも互換性のために意図的にそうしているのか、誰か知っていますか?
c++ - extern C 戻りクラス オブジェクト
他の C++ コードで解決できるように、より単純な名前のプラグインが必要です。
そして、プログラムの他の部分 (これも C++ であり、クラス B の同じ定義をプラグインと共有しています):
そのようなコードは問題を引き起こしますか? つまり、(標準で) C++ クラスをextern "C"
関数のパラメーターまたは戻り値の型として使用することは許可されていますか? 私の gcc では動作するようですが、他の gcc ではどうでしょうか?
c++ - Extern "C" としてマークされた C++ 関数はスローできますか?
extern "C"
C++ コードでしか呼び出されない場合でも、使用して宣言したい C++ 関数があります。はい、これが奇妙であることはわかっていますが、C と C++ の宣言が混在しているため、一貫性を保つためにやりたいことです。extern "C"
C++ 関数を as として宣言しても、スローの動作に影響しないことを確認したいだけです。
次のようになります。