2016-10-16 9 views
0

他のヘッダファイルで使われているGlobal.hと呼ばれる問題のファイルのコードです。ファイルにはヘッダファイルは含まれていませんが、インクルードされていないヘッダファイルのクラス/関数は引き続き使用できます

#pragma once 

enum SType {null, lab, assignment, testPrep}; 
enum Code {none, 123, 222, 333, 432}; 

template<typename D> 
bool validate(D task = string, D date = string) { 

    bool result = true; 

    if (task.size() < 3) { 
     cout << "Task too simple, please elaborate." << endl; 
     result = false; 
    } 
    else if (task.size() > 50) { 
     cout << "Task too detailed. Only 30 chars allowed." << endl; 
     task.empty(); 
     result = false; 
    } 

if (date == "02/20/93") { 
    date.empty(); 
    date = "My birthday!"; 
} 

    return result; 

} 

ご覧のとおり、名前空間または特定のファイルの使用を宣言することなく、文字列オブジェクトとostreamオブジェクトを使用できます。明らかに、これはGlobal.hが他の場所から情報を引き出していることを意味しますが、この情報がどこから来ているのか不思議です。私はいつもヘッダーファイルがファイル自体の#includeディレクティブに含まれていれば他のファイルのコードを再調整すると考えていたので、どういうことが起こっているのか分かりませんし、何が起こっているのか知りたいのです。

+0

あなたは 'g ++ -c Global.h'を使ってそれをコンパイルすることを意味します。 –

+0

@ Jean-Francois Fabreビジュアルスタジオで動作しますが、gccコンパイラが何をするのかは不明です – gotMoreGoodstuff

答えて

1

いいえ、このGlobal.hヘッダーファイルを含むものはすべて、必要なすべてのヘッダーを既に添付している必要があります。

簡略化のいくつか:#includeステートメントは、#includeステートメント自体の代わりに#includedファイルの内容を論理的に挿入することによって置き換えられます。翻訳単位をコンパイルすると、すべて#includeステートメントがこのように処理されます。すべての#includeステートメントが参照ファイルの内容で論理的に置き換えられるかのように。最終的な結果は、最初から最後までコンパイルされる単一の論理ソースファイル、つまり翻訳単位です。だから、

、前に参照されている<iostream>からクラスやその他のリソースへのすべての#include文の後に、限り、必要なヘッダファイル、<iostream>、および他のような、このように処理され、論理的に論理トランスレーションユニットに挿入されます場合にはこのヘッダーファイルから、この翻訳単位は問題なくコンパイルされます。 #includeと同じヘッダーファイルであるかどうか、必要なヘッダーファイルは<iostream>などです。または#include dを先に取得するその他のヘッダーファイルです。このヘッダーファイルは#includeです。それは問題ではありません。

それぞれのファイルが明示的に#includeの前提条件を満たしていることを示すことが良いことは事実です。しかし、他のヘッダファイルがすでに#include dになっている限り、翻訳単位はコンパイルされます。

+0

意味があります – gotMoreGoodstuff

関連する問題