2016-10-25 3 views
0

「foo.cpp」の先頭に「#include "foo.h"」という人がよく見られました。あなたのように見えるいつもこれを行うことができますが、人々はしません。したがって、選択肢には何らかの理由があるはずです。foo.cppにfoo.hを含める場合

#includeソースファイル(foo.cpp)内のヘッダ(foo.h)はいつですか?

+0

あなたが含まれていない(そして適切にコンパイルされている)例を教えてください。 – UnholySheep

+0

@ UnholySheep私が言う限り、これは実際にはまれに行われます。例えば、GitHubの主要なC++プロジェクトを見てください。例えばTensorFlowはGoogleの最大のオープンソースプロジェクトであり、ソースコード内でこれを頻繁にはしません:https://github.com/tensorflow/tensorflow – theJollySin

+2

'foo.h'がクラスを定義し、' foo.cpp'クラスのメンバ関数を定義すると、 'foo.cpp'は' foo.h'をインクルードする必要があります。他のケースでは、ほとんどオプションですが、私はそれをしない理由を考えることはできません。 – Brian

答えて

3

トップに置く理由は、その内容がほかのヘッダーに依存していないかどうかを確認するだけです。例:

// 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とは関係のないファイルにインクルードディレクティブを変更したときに発生する不思議なエラーを避けることができます。これらは時々識別するのが難しく、常にイライラしています。

+0

だから、この論理によって、私は常に "foo.cpp"に "foo.h"を含めるべきです。それはあなたの提案ですか? – theJollySin

+1

@theJollySin - はい。 foo.hで宣言されているものを定義するすべてのファイルは、 '#include' foo.hでなければなりません。それは安い保険だ。 –

1

ヘッダー内に何かを使用する場合は、ヘッダーを含める必要があります。

たとえば、メインメソッドにfoo someObject = new foo();を作成する必要がある場合は、そのクラス定義を持つヘッダfoo.hを含める必要があります。

あなたは、あなたが使用しようとしていることを含める必要があります。

1

いつでもヘッダーファイルを含めることができます。とにかく
は、あなたがファイルを持っていると仮定し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ディレクティブが広がっている乱雑なファイルにつながります。一般的なプラクティスは、すべてをファイルの先頭に置くだけです。

関連する問題