#endifの#ifdefの__cplusplusはextern「C」を{置くのに最適な場所です。どこで、私はCのヘッダファイルで</p> <pre><code>#ifdef __cplusplus extern "C" { #endif </code></pre> <p>を入れた方が良いです知っていただきたいと思い
開始時または終了時にはすべてが含まれます。どうして ?
#endifの#ifdefの__cplusplusはextern「C」を{置くのに最適な場所です。どこで、私はCのヘッダファイルで</p> <pre><code>#ifdef __cplusplus extern "C" { #endif </code></pre> <p>を入れた方が良いです知っていただきたいと思い
開始時または終了時にはすべてが含まれます。どうして ?
これに厳しい規則はありませんが、次の点に注意してください。
extern "C"の背後にあるアイデアは、コンパイラがCフレンドリなリンケージを生成するということだけです。そうでなければ、C++コンパイラでコンパイルされたコードは、Cコンパイラでコンパイルされたアーカイブでリンクするための名前を探し出し、見つけられません。
3番目の例:実際には、作成者がC++について気にしなかったCライブラリがあり、単にextern "C"というものを除外しています。あなたはむしろ外部ヘッダーを変更するか、独自の 'extern' C "'で囲まれた変更されていないヘッダーを含めるでしょうか?私は個人的に後者を好んでいます... – Aconcagua
この構築物は、Cリンカー(短い説明)だから、明らかにあなたが唯一自分のものを中心に、それを使用したい
からあなた名が利用できるようにするために使用されます。このよう
:
#ifndef MY_INCLUDE_H_ // include guard
#define MY_INCLUDE_H_
#include <...> // dependencies
#include "..."
#ifdef __cplusplus
extern “C” {
#endif
// ... your types, methods, variables
#ifdef __cplusplus
}
#endif
#endif // MY_INCLUDE_H_
extern "C"
は、コードがコンパイルされる方法に影響を与えます。 のヘッダは、がCとC++の両方でコンパイルされ、extern "C"
自身を管理するように設計されています。 never ブロック内に#include
ディレクティブをラップする必要があります。関連するヘッダーが両方向でコンパイルされるように設計されていて、両方向で使用するように設計されていない場合はエラーです。
「設計されている」と「設計されていない」という意味はどうですか? – Vincent
extern "C"がリンケージに影響します。 C++関数がコンパイルされるときに、その名前が変わると、C++でのオーバーロードが可能になります。したがって、関数名はパラメータの型と数に基づいて変更されるため、同じ名前を持つ2つの関数は2つの異なるシンボル名を持ちます。
extern "C"内のコードはまだC++コードです。 extern "C"ブロックでできることには限界がありますが、それらはすべてリンケージに関するものです。
そうでなければ明確な答えでは、 "C++名のマングリング"という言葉を削除したいかもしれません。 –
@Jaap Versteeghなぜこの種の動作を識別するために使用される用語を削除しますか?誰かが何が起こっているのか、なぜそれが何であるかについてもっと詳しく知りたいのであれば、これはより多くの情報を検索するために使用すべき用語です。 – hobb
@hobb私は「追加」のように「ドロップイン」と言っていました。名前のマングリングは答えに*記載されておらず、あなたが言うように、これはこの動作の名前です。 –
私はインクルードの後に言うでしょう、なぜあなたはそのifdefの中にインクルードを入れますか? –