必要に応じて警備員を冗長含まれていますか?
-
19-09-2019 - |
質問
必要なのCodeGear RAD Studioの2009年に '冗長警備員が含ま' をしていますか?その上でこれに対処するために十分賢いコンパイラが所有していていますか?
たとえば、私は以下のかもしれませんがfoo.hに「ガードを含めます」
#ifndef fooH
#define fooH
// ... declaration here
#endif
とuse_foo.hの「冗長ガードを含む」次の
#ifndef fooH
#include "foo.h"
#endif
また、コンパイラは十分にスマートでない場合、それらはソースファイルに含まれている場合necesarry「冗長警備員が含ま」をしています。例えばuse_foo.cpp
。 ?
解決
あなたが「冗長ガードを含める」としてマークされたコードの部分は必要ありませんが、それはの最適化します。
の可能性ありは、C ++ Builderの場合には、ヘッダガードを検出するためのロジックがあるので、必要であってはなりません。
それははこれをの最適化は非常にとにかくあなたを買うだろう。そうですので、一般的なケースでは、前処理パスは、とにかく通常かなり速いです
他のヒント
これらの冗長は、警備員が提案#pragma once
ディレクティブの機能をエミュレートすることを意図している含まれます:いくつかのヘッダファイルがすでに含まれている場合は、プリプロセッサもオープン、探ししようとはしません、それはとしなければならないとして(もうそれを解析「普通」)はガード技術が含まれます。多くの場合、これは、はるかに効率的なファイル(コンパイルをスピードアップ)。
このアプローチは、明らかに高いメンテナンスです:。1は、ガードシンボルのスペルは正確にヘッダファイル内の同じだけでなく、外であることを確認する必要があります。
あなたはそれを呼び出すように、「冗長ガードを含める」、コンパイルをスピードアップします。
冗長ガードがなければ、コンパイラは#ifndef
ブロックの外側であるかもしれないいくつかのコードを探して、全体がfoo.hファイルを反復します。それは、長いファイルだし、これは多くの場所で行われている場合、コンパイラは、多くの時間を無駄にすることがあります。しかし、冗長なガードで、それは全体#include
文をスキップしていなくても、そのファイルを再度開くことができます。
もちろん、あなたはコンパイラがfoo.hを反復処理し、実際には何をコンパイルしないことにより、無駄な時間の実際の量を実験して見る必要があるだろう。おそらく現代のコンパイラは、実際にこのパターンを探し、自動的にすべてのファイルを開く気にしないように知っている、私は知りません。
(280Z28で編集を開始します)。
次のヘッダ構造は、少なくとものGCCとMSVCによって認識されます。このパターンを使用すると、を含むファイル内の警備員で得ることができ、事実上すべての利点を否定します。コンパイラは構造を調べる時にコメントを無視することに注意してください。
// GCC will recognize this structure and not reopen the file
#ifndef SOMEHEADER_H_INCLUDED
#define SOMEHEADER_H_INCLUDED
// Visual C++ uses #pragma once to mark headers that shouldn't be reopened
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
// header text goes here.
#endif
(エンド・編集)