ヘッダファイルとC++の文法について

勉強を始めたときに何がわからなかったのか、どこでつまったのか備忘録として、いまさらながら記述したいと思う。


まずルールについてのあれこれは、本読めば大体わかりますので、今回は大まかな流れを記述しましょう。

まず、c++のソースファイルの拡張子は.cppなので、今回は適当にsample_main.cppというファイルを作成します。

名前はわかるように適当で構いません。

ファイルの中身ですが、vimエディタでもテキストでも適当にエディタを使用してください。


sample_main.cpp

(以降が中身です)

#include<〇〇>※〇〇にはあとで記入します

int main(){

※内容記述

return 0;

}

基本的な形はこれだけです。

main関数は、0を返して終了するので最後に0を返してます。

※まあ、未記入でも0を返してくれるので入れない人もいます。

では簡単な計算を入れてみましょう。

#include<〇〇>※〇〇にはあとで記入します

int main(){

int a = 2 ;//変数aを宣言して初期化

int b = 3 ;//変数bを宣言して初期化

int c = 0; //変数cを宣言して初期化

c = a * b;

return 0;

}

これで計算がされてcの値は最終的に6になります。

ただこれだと、結果が表示されずに、計算されてプログラムが終了するので、iostreamという関数群(これをライブラリといいます)の中のstd::cout関数を利用しましょう。

ただ、毎回std::と書くのは面倒なので教本とかだとよくusing namespace std;として名前空間の中に置き、記述しています。今回もそうしますが、専門書を読み進めると次第に名前空間は限定的に使いましょうとかめったなことがなければ使うなとかぼろくそに書いてある本もあるので、そういうものだと考えることにします。

つまり必ずしもこのusing~を書かなければならないわけではないのです。

ついでに関数も使って、こんな感じに変えました。

#include<iostream>

using namespace std;

int keisan1(int a, int b){

cout << "keisan1が呼ばれました" << endl;

int c;

c = a * b;

return c;

}

int keisan2(int a, int b){

cout << "keisan2が呼ばれました" << endl;

int c;

c = a + b;

return c;

}

int main(){

cout << keisan1(2, 3) << endl;

cout << keisan2(3, 3) << endl;

return 0;

}


ここで、ヘッダファイルの使い方についてですが、本来は、関数やクラスの宣言を書き留めておき、整理するために使われています。

つまり

main.cpp // 本来の実行内容の記述

head.h //拡張子は.hで関数やクラスの宣言を記述

head.cpp //名前はどうでもいいが、関数やクラスの処理内容(定義)の記述

といった形式をとることが多いです。

先ほど書いたプログラムだと短いのですが int main()以前の文書をヘッダファイル

sample_h.hというファイルを作って記述してみました。

sample_h.h

#include<iostream>

using namespace std;

int keisan1(int a, int b){

cout << "keisan1が呼ばれました" << endl;

int c;

c = a * b;

return c;

}

int keisan2(int a, int b){

cout << "keisan2が呼ばれました" << endl;

int c;

c = a + b;

return c;

}

続いてsample_main.cppは

int main(){

cout << keisan1(2, 3) << endl;

cout << keisan2(3, 3) << endl;

return 0;

}

です。

定義もヘッダファイルに含まれていますが、まあ実行できるか試してみるわかりやすさを追求した結果ですので、いろいろあとは試してみてください。

これをmakefileに

sample_main: sample_main.cpp

g++ sample_main.cpp -o sample_main

としてmakeした結果がこれです。





無事に実行できました。

ヘッダファイルは同じディレクトリに入れておき、mainのソースファイルでインクルードすると、コンパイル時にヘッダファイルを指定していなくても参照されることがわかります。

まあ定義を別ファイルにする場合、ヘッダファイルのインクルードが二重で読み込まれないようにインクルードガードという記述が必要になります。

次回で触れられたらいいな。

はせがわさんとねこの小部屋

プログラミングの勉強と電子工作についてのブログ

0コメント

  • 1000 / 1000