第12講 分割ファイル・分割コンパイル 
第3話 ヘッダファイルを置く場所
入門
さて、a.hをドラッグして
c言語
ファイルをヘッダーファイルに移動して、Ctrl+F5をしてみてください。
初歩
まったく問題なしに、ビルドできます。
ヘッダーファイルは、ソースファイルフォルダにあってもヘッダーファイルフォルダにあっても関係ないことがわかります。
ファイルを整理して管理するためこれからヘッダーファイル(拡張子がhのファイル)は、ヘッダーファイルフォルダに入れることにしましょう。
ヘッダーファイルを右クリック→追加→新しい項目と進み、名前をbとして、次のようにコーティングしてみましょう。
void g(){
   cout<<"ファイルb"<<endl;
}
そして、m.cppのコードを次のように変更します。
#include"a.h"
#include"b.h"
int main(){
   f();
   g();
}
Ctrl+F5でビルドします。
初心者
問題なく実行できます。
基礎
ところで、b.hにおいては何故
#include<iostream>
using namespace std;
がなくてエラーしないのでしょうか。
coutを使うためにはこの2行は必要でした。
実際、a.h空この2行を削ってCtrl+F5するとエラーします。

なのに、何故b.hには必要ないのでしょうか。
試しに
a.hを
void f(){
   cout<<"ファイルa"<<endl;
}
b.hを
#include<iostream>
using namespace std;
void g(){
   cout<<"ファイルb"<<endl;
}
と変更するとやはりエラーします。
謎は深まるばかりです。
実は、m.ccpを次のように変更するとエラーが解消されます。
#include"b.h"
#include"a.h"
int main(){
   f();
   g();
}
そうです。インクルードファイルとインクルード(読み込み)の順番に答えがあります。
b.hのみに
#include<iostream>
using namespace std;
を置くときは、先にb.hファイルをインクルード(読み込み)しなければならないのです。

次のファイル構成の時でトレースしてみましょう。
ソースファイルm.cpp
#include"b.h"
#include"a.h"
int main(){
   f();
   g();
}
ヘッダーファイルa.h
void f(){
   cout<<"ファイルa"<<endl;
}
ヘッダーファイルb.h
#include<iostream>
using namespace std;
void g(){
  cout<<"ファイルb"<<endl;
}


この場合は、コンピュータ次の順で文を読んでい行きます。

#include"b.h"             
#include"a.h"              ⑦ 
int main(){              ⑫ 
   f();               ⑬ 
   g();               ⑭ 
}             ⑭ 
void f(){              ⑧ 
   cout<<"ファイルa"<<endl;              ⑨ 
}              ⑩ 
#include<iostream>              ② 
using namespace std;               ③ 
void g(){               ④ 
  cout<<"ファイルb"<<endl;              ⑤ 
}              ⑥ 

一番最初にC言語プログラムの親分であるmainの入ったm.cppファイルを読み込みます。
そして、①においてヘッダーファイルb.hをインクルードします。
②においてiostreamがインクルードされ、
③においてusing namespace std; 
の命令が遂行されます。
したがって、後にインクルードされるa.hの前に
#include<iostream>
using namespace std;
の2行がコンピュータによって読まれています。
ですから、a.hにおいてはこの2行はなくてもエラーしないのです。


ヘッダーファイルフォルダにc.hを作り、ソースを
void h(){
   cout<<"ファイルc"<<endl;
}
としm.cppのコードを
#include"b.h"
#include"a.h"
#include"c.h"
int main(){
   f();
   g();
   h();
}
と変更してCtrl+F5すると、
初歩
となります。


今回作ったプログラムは余りに単純ですので、より高度化を図りたいと思います。
例えば、次のようなファイル構成にしたらどうでしょうか。
ソースファイルm.cpp
#include"b.h"
#include"a.h"
#include"c.h"
int main(){
   f();
   g();
}
ヘッダーファイルa.h
void f(){
   a=5;
}
ヘッダーファイルb.h
#include<iostream>
using namespace std;
void g(){
  int a;
}
ヘッダーファイルc.h
void h(){
   cout<<a<<endl;
}

答えは明らかですよね。

第2話へ 第4話へ

戻る

C言語講義第1部へ
VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)