(ナレッジポイント1)一度#ifndefのと解決の#pragma

例えば

 

  

 

複数回、同じファイルを避けるために、C / C ++含めるには二つの方法がありますが、一つは#ifndefの方法で、一つの方法は、一回の#pragmaです。これらの2つのコンパイラをサポートするための方法では、両者の間に大きな違いはありませんが、両方はまだいくつかの微妙な違いがあります。
    一つの方法:

    __SOMEFILE_H__ #ifndefの
    の#define __SOMEFILE_H__
   文を定義する... ... //宣言、
    #endifの


    第二の方法:

    #pragmaしたら
    ... ... //宣言、定義のステートメント

    C / C ++言語の標準サポートにより、#ifndefの方法。これは、同じファイルが複数回含まれないことを保証するだけでなく、二つの同一のファイル(またはスニペット)の内容を保証するために、不用意に含まれているではありませんだけではなく。
    時々の状況逮捕非常に人々 -もちろん、欠点は、別のヘッダファイルのマクロ名が誤って「クラッシュ」はっきりとヘッダファイルが存在して見にあなたを導く可能性がある場合、コンパイラはそれが難しい状況が宣言したと言って見つけることができないということです怒っ。
    コンパイラは常に大規模なプロジェクトをコンパイルするときに、IFNDEFは、コンパイル時間が比較的長いので、いくつかのコンパイラは徐々に道後に#pragmaをサポートするために始めたようになります、重複した定義が存在するかどうかを判断するために、ヘッダファイルを開く必要があります。

    #pragmaは、かつて一般的に、コンパイラによって保証されます。同じファイルが複数回含まれません。用語「同一ファイルは」物理的にファイルではなく、同じ内容の2つのファイルを意味しています。あなたは、プラグマは一度だけファイルの、ヘッダファイル内のコードの一部に宣言することはできません。
    利点は、あなたがハードマクロの名前を考える必要がないということです、もちろん、マクロ名が表示されない衝突による奇妙な問題があります。したがって、コンパイル速度の大規模プロジェクトと少し改善します。
    対応する欠点は、ファイルヘッダの複数のコピーである場合には、本発明の方法は、彼らが繰り返し含まれていないことを保証するものではありません。もちろん、質問に比べて「文を見つけることができない、」マクロ名の衝突がトリガ、これはより容易に検出して補正含まれています。

    一度、次のように#ifndefの中で生産の#pragma、非常に多くの人々も聞いたことがないかもしれません。今では#ifndefのより多くの尊敬と思われます。および#pragma方法は、コンパイラのサポートの古いバージョンの一部の対象ではありません一度、いくつかのサポートコンパイラはまた、それを取り除くしていき、それので、#ifndefのは、どのコンパイラによって限定されるものではない、C / C ++言語の標準をサポートするため、互換性は十分ではないかもしれません。一般的には、ケースを聞くために、プログラマは、時間の独自のコード「ライブ」長い期間をしようとするために、#ifndefの方法を選択します、通常のコンパイラの性能の数を減らすことを好む、それはプログラマの個性であるとき、当然のことながら、これは余談です友人。

    一つの使用は、2つが一緒に入れ確認することです。

    #pragma一度
    #ifndefの__SOMEFILE_H__
    の#define __SOMEFILE_H__
    ... ... //宣言、定義文
    の#endif

    両方の利点の両方をしたいようです。しかし限り、コンパイラエラーに一度の#pragmaをサポートするので、2つの方法がより多くの利益をもたらすように見えることはできません混在させることはできません避けることができない#ifndefのマクロ名の競合を使用する危険性があるとして、それは慣れていない一部の人を作る触れます混乱し。

    場合に応じて選択した方法、それは、状況下で二つの方法で理解されるべきです。限り欠点を回避するために合理的な合意があるとして、私は許容されている方法だと思います。そして、これは標準のコンパイラではないか、責任は小さな範囲内規範のプログラマや開発を取得する必要があります。

    ところで:私はいくつかの議論GNUバージョンはGCC 3.4で意図しているようで見てきたの#pragmaのサポートの取り消しを一度(および超えて?)。しかし、実際には、私の手のGCC 3.4.2とGCC 4.1.1はまだ廃止の警告でもない、一度に#pragmaをサポートしますが、GCC2.95がかつて提案した警告を#PRAGMAます追加されます。
    VC6以降のバージョンでは、モード一回の#pragmaのサポートを提供し、この機能は基本的に安定しなければなりません。 

おすすめ

転載: www.cnblogs.com/kekeoutlook/p/11210804.html