「foo.cpp」の先頭に「#include "foo.h"
」という人がよく見られました。あなたのように見えるいつもこれを行うことができますが、人々はしません。したがって、選択肢には何らかの理由があるはずです。foo.cppにfoo.hを含める場合
#include
ソースファイル(foo.cpp)内のヘッダ(foo.h)はいつですか?
「foo.cpp」の先頭に「#include "foo.h"
」という人がよく見られました。あなたのように見えるいつもこれを行うことができますが、人々はしません。したがって、選択肢には何らかの理由があるはずです。foo.cppにfoo.hを含める場合
#include
ソースファイル(foo.cpp)内のヘッダ(foo.h)はいつですか?
トップに置く理由は、その内容がほかのヘッダーに依存していないかどうかを確認するだけです。例:
// foo.h
void f(std::vector<int>& v);
// foo.cpp
#include <vector>
#include "foo.h"
// foo1.cpp
#include "foo.h"
#include <vector>
foo.cppには問題はありません。すべてがうまくコンパイルされます。一方、foo.hはincludeディレクティブなしでstd::vector
を使用するため、foo1.cppはコンパイルされません。
すべてのヘッダーファイルをコンパイル可能にすると、foo.cppとは関係のないファイルにインクルードディレクティブを変更したときに発生する不思議なエラーを避けることができます。これらは時々識別するのが難しく、常にイライラしています。
だから、この論理によって、私は常に "foo.cpp"に "foo.h"を含めるべきです。それはあなたの提案ですか? – theJollySin
@theJollySin - はい。 foo.hで宣言されているものを定義するすべてのファイルは、 '#include' foo.hでなければなりません。それは安い保険だ。 –
ヘッダー内に何かを使用する場合は、ヘッダーを含める必要があります。
たとえば、メインメソッドにfoo someObject = new foo();
を作成する必要がある場合は、そのクラス定義を持つヘッダfoo.h
を含める必要があります。
あなたは、あなたが使用しようとしていることを含める必要があります。
いつでもヘッダーファイルを含めることができます。とにかく
は、あなたがファイルを持っていると仮定しmain.h
次のような:あなたが述べたように、このmain.cpp
作品だけで罰金、今
#ifndef FOO_H
#define FOO_H
struct S { };
#endif
:
void f() { }
#include "foo.h"
int main() { f(); }
とにかく、私は少しmain.cpp
を変更した場合もう動作しません。
void f() { S s{}; }
#include "foo.h"
int main() { f(); }
問題はですは最初に使用された後に宣言され、f
の定義が初めて発生したときには表示されません。
したがって、経験則は、に、そのファイルでインポートされた何かを使用する直前にヘッダを含めることができます()。
とにかく、これは速く#include
ディレクティブが広がっている乱雑なファイルにつながります。一般的なプラクティスは、すべてをファイルの先頭に置くだけです。
あなたが含まれていない(そして適切にコンパイルされている)例を教えてください。 – UnholySheep
@ UnholySheep私が言う限り、これは実際にはまれに行われます。例えば、GitHubの主要なC++プロジェクトを見てください。例えばTensorFlowはGoogleの最大のオープンソースプロジェクトであり、ソースコード内でこれを頻繁にはしません:https://github.com/tensorflow/tensorflow – theJollySin
'foo.h'がクラスを定義し、' foo.cpp'クラスのメンバ関数を定義すると、 'foo.cpp'は' foo.h'をインクルードする必要があります。他のケースでは、ほとんどオプションですが、私はそれをしない理由を考えることはできません。 – Brian