ファイルにiostreamやその他のヘッダファイルを2回含めるとどうなるか教えてください。私はコンパイラがエラーをスローしないことを知っている。コードが2回追加されるのか、内部的に何が起こるのでしょうか?ヘッダーファイルを含めると実際に何が起こりますか?C++で2回ヘッダファイルを含む
答えて
Include guardは、ファイルの内容がコンパイラによって実際に2回見られるのを防ぎます。あなたは2回マクロSOME_STRING_H
ラウンド初めてのファイルが含まれている場合ので、定義されておらず、今
#ifndef SOME_STRING_H
#define SOME_STRING_H
//...
#endif
:
ガードは基本的に、ヘッダファイルの最初と最後にプリプロセッサの条件付きディレクティブのセットです含めますファイルの内容が処理され、コンパイラに表示されます。しかし、#ifdef
の後の最初のものは#define
であるので、SOME_STRING_H
が定義され、次回はコンパイラによってヘッダファイルの内容が見えなくなります。
衝突を避けるために、インクルードガードで使用されるマクロの名前は、ヘッダーファイルの名前に依存します。
ちょうど注:マイクロソフトのツールを使用するとき、あなたはしばしば '#pragma once'を見ます。これは、同じようなfunctinalityを持っています。 '#ifndef ...'コンパイラの互換性を高めるには、後者を使用する必要があります。 – AquilaRapax
また、ほとんどのコンパイラがこのパターンを認識し、ファイルを2度目に見たときにファイルを開くことさえありません。 –
これは実際に質問に答えるものではありません。私は他の人のコードを見ているので、元の質問に興味があります。 – Frederick
これは単にため、次の行に沿ってプリプロセッサコードに、スキップされます:
#ifndef MY_HEADER_H
#define MY_HEADER_H
<actual header code here>
#endif
あなたが二回含めるのであれば、その後、MY_HEADER_H
がすでに定義されており、#ifndef
と#endif
間のすべてがプリプロセッサによってスキップされます。
ヘッダーファイルは単純な獣です。 #include <header>
の場合、header
の内容は基本的にファイルにコピー・ペーストされます。複数回含まれているからヘッダを停止するには、include guards
は、ほとんどのヘッダファイルにあなたはそれが依存
#ifndef SOME_HEADER_FILE_GUARD
#define SOME_HEADER_FILE_GUARD
//Contents of Header
#endif
に似て何かを参照してくださいよ理由である、使用されています。 <assert>
を除いて、標準では、標準ヘッダーの2番目(およびそれ以降)にはノーオペレーションを含めることが必要です( )。しかし、これはヘッダの特性である です。コンパイラは( 概念的に) がインクルードに出会うたびにすべてのヘッダーテキストを読み込み、インクルードします。 のようなものに囲まれますヘッダー内のC++コードのすべて:
このような場合には複数の定義を回避するための標準的な実践が使用警備員を含めること で明らかに
#ifndef SPECIAL_NAME
#define SPECIAL_NAME
// All of the C++ code here
#endif SPECIAL_NAME
、各ヘッダが必要別の名前。アプリケーション内では、通常 というファイル名と の場所に基づいて規則を確立できます。 subsystem_filename
のようなもので、 の文字はマップされています(大抵は大文字のものがほとんどです)。C++シンボルで正しくありません( のファイル名で使用している場合)。 ライブラリの場合、適切な長さの文字列をランダムに生成するのがベストプラクティスです。 (確かに が実装の品質の観点から劣っていますが) のすべての記号が文書化された接頭辞で始まることを保証することです。
システムライブラリは、もちろん、予約されたシンボル(例:記号 はアンダースコアで始まり大文字で始まります)ここでは には矛盾がないことが保証されています。あるいは、実装に依存する別の手法である を完全に使用することもできます。たとえば、 は、コンパイラ拡張子#pragma once
を使用します。 g ++はインクルードガードを使用します。 は常に_GLIBCXX
で始まります(これはユーザコードの正当なシンボルではありません)。 これらのオプションは必ずしも利用可能なわけではありません。
- 1. 私のソースフォルダのヘッダファイルを含むEclipse C++
- 2. CMake - プリプロセッサディレクティブを含むヘッダファイル
- 3. 関数がCヘッダファイルで2回宣言されました
- 4. 異なるディレクトリのヘッダファイルを含む?
- 5. ヘッダファイルを含むときの未定義参照
- 6. 私のヘッダファイルでC++
- 7. ヘッダファイルを含めるには
- 8. サブアイテムを含むListViewは2回同じ情報を避ける
- 9. オプションでC++にヘッダファイルをインクルード
- 10. 重回帰 - 2つの変数(log(t)+ t)を含むプロットr
- 11. C++ファイルを含むC++
- 12. C++ ::ヘッダファイルに
- 13. GHCのFFIにCヘッダファイルを含める際の解析エラー
- 14. file.inputstreamを2回読む
- 15. C++ヘッダファイルのインクルードとコンパイルC
- 16. 2つのモデルクラスを含む、
- 17. Cヘッダファイルとコンパイル/リンク
- 18. C++ヘッダファイル封入エラー
- 19. cプログラムに含まれるヘッダファイルのデフォルトパスは?
- 20. Cファイルに含まれるすべてのヘッダファイルのリスト
- 21. Nansを含む線形回帰
- 22. C++ C++のヘッダファイルでのtypedefと型名
- 23. Android NDK:boost C++ライブラリを含む
- 24. C#他のファイルを含む
- 25. Q_OBJECTを含むC++マクロ
- 26. UWAにC#ConsoleApplicationを含む
- 27. C++警備員を含む
- 28. Voce C++はセットアップを含む
- 29. C# - LINQ頭痛を含む
- 30. Emotiv C# - ライブラリを含むエラー
大きな助け:: http://www.cplusplus.com/forum/articles/10627/ – Abhineet