第12講 分割ファイル・分割コンパイル
第3話 ヘッダファイルを置く場所
さて、a.hをドラッグして
ファイルをヘッダーファイルに移動して、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入門講義(基礎から応用まで)