2

C++ プロジェクトを解析し、ヘッダー ファイルが自己完結型かどうかを判断するツールはありますか。つまり、ファイル Foo.cc (または Foo.h) が何らかのクラス Bar (ベクトルなど) に言及している場合、それ自体にクラスを定義するヘッダー ファイルが含まれています。 (Bar を定義するファイルなど<vector>) ?

編集: 明確にしたい: ヘッダー ファイル Foo.h が vector に言及し、そのインクルードの 1 つに既に vector が含まれている場合、コンパイラは満足しています。私はそれをしたくありません。Foo.h で vector が言及されている場合は、それを直接インクルードし、別のヘッダーに依存しないようにする必要があります。コンパイラはこれをキャッチしますか?

4

4 に答える 4

4

コンパイラがこれを行います。多くの C++ スタイル ガイドでは、この理由から、すべての .cpp ファイルに対応するヘッダーを最初の実質的な include ディレクティブとして含めることを強く推奨しています。

于 2012-06-10T21:05:56.883 に答える
3

これにはスクリプトを使用しました。ここに簡略化されたバージョンがあります:

#!/usr/bin/env bash
# hcheck: Check header file syntax (works on source files, too...)
if [ $# -eq 0 ]; then
    echo "Usage: $0 <filename>"
    exit 1
fi

for f in "$@" ; do
    case $f in
        *.c | *.cpp | *.cc | *.h | *.hh | *.hpp )
            echo "#include \"$f\"" > hcheck.cpp
            printf "\n\033[4mChecking $f\033[0m\n"
            make -s hcheck.o
            rm -f hcheck.o hcheck.cpp
            ;;
    esac
done

もちろん、が必要ですMakefile。それを望まない場合は、そのmake行を適切なgccコマンドに置き換えてください (フラグを忘れないでください!)。Makefileオブジェクトを現在のディレクトリ以外の場所に置く場合も、微調整する必要があります。

改善すべき点はたくさんあると確信しています。これについて人々に話すと、「ヘッダーをコンパイルするのはばかげた考えです」というお決まりの応答がありますが、私にとってはうまく機能し、ソースを持たないか、ソースに最初に含まれていないヘッダーで使用できます。

于 2012-06-10T21:31:52.017 に答える
0

自己完結型ヘッダーの目標を達成する負担を軽減する 1 つの方法は、そこで宣言されているクラス (通常) またはフリー関数 (場合によって) が、単一の責任の原則を順守する場合のように、非常に具体的な意図を持っていることを確認することです。そうすることで、ヘッダーを含める必要がある依存関係が少なくなります。

于 2012-06-10T21:36:07.687 に答える
0

私はそのようなツールを知りません。問題は思ったほど簡単に解決できるものではありません。たとえば、自己完結型にするためには、次のどのヘッダー ファイルを含める必要がありますか?

#ifdef FOO
  std::vector<int> getVector();
#endif

  void doStuff(std::string);

を含める必要がある場合とそうでない場合があります<vector>。それはFOOが定義されているかどうかに依存し、このファイルの前に含まれていたものに応じて、定義されている場合と定義されていない場合があります。

一般に、プリプロセッサ マクロは、ヘッダーを「単独で」読み取ろうとする試みを混乱させる可能性があります。

于 2012-06-10T21:36:09.903 に答える