5

Codegear RAD Studio 2009では「冗長インクルードガード」が必要ですか?コンパイラはそれ自体でこれを処理するのに十分賢いですか?

たとえば、foo.hに次の「includeguard」があるとします。

#ifndef fooH
#define fooH
// ... declaration here
#endif

そして、use_foo.hの次の「冗長インクルードガード」:

#ifndef fooH
    #include "foo.h"
#endif

さらに、コンパイラが十分に賢くない場合、ソースファイルに含まれている場合は「冗長インクルードガード」が必要です。例:use_foo.cpp。?

4

3 に答える 3

5

「冗長インクルードガード」としてマークしたコードの部分は必要ありませんが、最適化の可能性があります。

C ++ Builderの場合、ヘッダーガードを検出するロジックがあるため、必要ありません。

一般的なケースでは、前処理パスは通常、とにかくかなり高速であるため、この最適化によってとにかく多くの費用がかかる可能性はほとんどありません。

于 2010-02-10T17:45:25.927 に答える
3

これらの冗長なインクルードガードは、提案された#pragma onceディレクティブの機能をエミュレートすることを目的としています。ヘッダーファイルがすでにインクルードされている場合、プリプロセッサはそれを検索、オープン、解析することさえしません(「通常の」で行う必要があるため)。ガードテクニックを含む)。多くの場合、これによりインクルードファイルの処理がはるかに効率的になります(コンパイルが高速化されます)。

このアプローチは明らかにメンテナンスの手間がかかります。ガードシンボルのスペルがヘッダーファイルの内側と外側でまったく同じであることを確認する必要があります。

于 2010-02-09T23:54:01.200 に答える
2

「冗長インクルードガード」は、あなたがそれを呼ぶように、コンパイルをスピードアップします。

冗長ガードがないと、コンパイラはfoo.hファイル全体を反復処理し、#ifndefブロック外にある可能性のあるコードを探します。それが長いファイルであり、これが多くの場所で行われる場合、コンパイラーは多くの時間を浪費する可能性があります。#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

(編集終了)

于 2010-02-09T23:48:39.140 に答える