2013-04-18 12 views
7

#endifの#ifdefの__cplusplusはextern「C」を{置くのに最適な場所です。どこで、私はCのヘッダファイルで</p> <pre><code>#ifdef __cplusplus extern "C" { #endif </code></pre> <p>を入れた方が良いです知っていただきたいと思い

開始時または終了時にはすべてが含まれます。どうして ?

+1

私はインクルードの後に​​言うでしょう、なぜあなたはそのifdefの中にインクルードを入れますか? –

答えて

9

これに厳しい規則はありませんが、次の点に注意してください。

  1. 一般的な原則は、各ヘッダーファイルが自分自身を処理する(自己完結している)ことです。したがって、この原則では、ヘッダーファイルにextern "C"が含まれているため、ヘッダーファイルをextern "C"にラップする必要はありません(必要な場合)。したがって、現在のファイルでは、もう一方のインクルードの後に​​置きます。
  2. しかし、ヘッダーがたくさんある場合は、extern "C"を追加したくないし、1つのインクルードで利用できるようにしたい場合は、是非先に進んでラップしてくださいファイルワイドエクスターナル "C"に格納されます。

extern "C"の背後にあるアイデアは、コンパイラがCフレンドリなリンケージを生成するということだけです。そうでなければ、C++コンパイラでコンパイルされたコードは、Cコンパイラでコンパイルされたアーカイブでリンクするための名前を探し出し、見つけられません。

+0

3番目の例:実際には、作成者がC++について気にしなかったCライブラリがあり、単にextern "C"というものを除外しています。あなたはむしろ外部ヘッダーを変更するか、独自の 'extern' C "'で囲まれた変更されていないヘッダーを含めるでしょうか?私は個人的に後者を好んでいます... – Aconcagua

9

この構築物は、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_ 
+0

あるいは、C++コード内でC関数を使用できるようにするには... – Aconcagua

+0

@Aconcaguaこれは、インクルードされたCヘッダーで処理する必要がありますが、最後の手段として、はいです。しかし.cppファイルでは、ヘッダーではありません。 – Offirmo

+0

スレッドには 'C'というタグが付いているので、この点からも実際にはCヘッダになっている可能性があります。 – Aconcagua

1

extern "C"は、コードがコンパイルされる方法に影響を与えます。 のヘッダは、がCとC++の両方でコンパイルされ、extern "C"自身を管理するように設計されています。 never ブロック内に#includeディレクティブをラップする必要があります。関連するヘッダーが両方向でコンパイルされるように設計されていて、両方向で使用するように設計されていない場合はエラーです。

+0

「設計されている」と「設計されていない」という意味はどうですか? – Vincent

1
  • extern "C"がリンケージに影響します。 C++関数がコンパイルされるときに、その名前が変わると、C++でのオーバーロードが可能になります。したがって、関数名はパラメータの型と数に基づいて変更されるため、同じ名前を持つ2つの関数は2つの異なるシンボル名を持ちます。

  • extern "C"内のコードはまだC++コードです。 extern "C"ブロックでできることには限界がありますが、それらはすべてリンケージに関するものです。

+0

そうでなければ明確な答えでは、 "C++名のマングリング"という言葉を削除したいかもしれません。 –

+0

@Jaap Versteeghなぜこの種の動作を識別するために使用される用語を削除しますか?誰かが何が起こっているのか、なぜそれが何であるかについてもっと詳しく知りたいのであれば、これはより多くの情報を検索するために使用すべき用語です。 – hobb

+0

@hobb私は「追加」のように「ドロップイン」と言っていました。名前のマングリングは答えに*記載されておらず、あなたが言うように、これはこの動作の名前です。 –

関連する問題

 関連する問題