C言語には様々な関数(printfやscanf)があることは以前お話ししました。
そして、その時に関数を自作することもできるとお話ししました。

今回は、printfのような関数そのものを作成する方法を学びます。
これができれば、長大なソースコードを書くこともできるようになるでしょう。

ソリューション エクスプローラー→ヘッダーファイル の上で 右クリックし、追加→新しい項目を選んで下さい。
BlogPaint

名前はなんでも良いです。.hファイルを選択しているかだけ確認して下さい。
109


今回は、Original.hというファイルを作成しました。
今までインクルードしてきたStdio.hに似ていますね。
そうです。似ているというか同じなのです。

それでは、Original.hへ関数を記述していきましょう。
今回は、渡された引数1と引数2を加算した結果を返却する。Add関数を書いてみましょう。
110


こんな感じです。

Add関数のiとjに着目してみましょう。これは仮引数と言い、名前の通りその関数内で一時的に使用する変数を言います。今回は、int型の変数iとjを宣言しました。
つまりこの関数は、int型の整数を2つ受け取るということです。
Source.cppファイルにて、Original.hをインクルードすると、Add関数を使用できるようになります。
その時、Add(1, 2);のように指定するのです。すると、Add関数内部では、iは1、jは2となり、Add関数内部にてiとjを足した結果をreturn するようになるのです。

もちろん、Add(3, 5);とSource.cppファイル内で書けば、iは3、jは5となります。
つまり、iとjは渡される引数を汎用化した変数なのです。

この関数はint型の整数を返却するよう指定しているので、return 整数(i + j)を指定しています。

ものは試しで、実際にSource.cppファイル上にOriginal.hをインクルードしてAdd関数を使ってみましょう。
111


実行結果
112


自作の.hファイルをインクルードする時は、<>ではなく" "を使用して下さい。
また、Original.hファイルの1行目に #pragma onceとありますが、
これは万一多重インクルードしたとしても、問題なくプログラムを動かす為に存在するインクルードガードと呼ばれるものです。消さないで下さい。

もし消すと、次のソースコードはコンパイルエラーになります。(消さなかった場合はエラーになりません)


例えば、引数が必要ない関数を作成する場合、()内にvoidを指定することもできます。
……どこかで見たことがありますね。

そうです。main関数です。
main関数は最初に実行されるが故に、引数の取りようがないのです。
main関数へ引数を渡すとなると、もはや実行前に渡す必要があります。そしてその方法もあります。あまり使いませんが。

返却する値(戻り値)がない場合、voidを指定することができます。
その場合は、return ; とだけ書いて関数を返却します。


Add関数の下へP関数を追記してみました。

main関数から使用してみましょう。

113

引数がないので、()だけを書くことになります。Pだけだとコンパイラは変数と勘違いするので、関数を使う時は、引数がない場合でも必ず()を付けます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ここで、変数の有効範囲についてお話しておきましょう。
変数は、宣言した箇所によって有効範囲が変わります。
関数あるいは{}の内部で宣言した変数はローカル変数と呼ばれ、そのブロック内でのみ有効です。
つまり、その関数あるいは{}が終了した時、その変数は解放されます。

関数の外部で宣言した変数はグローバル変数と呼ばれ、そのソースファイル上で有効となります。