C言語のプログラミングにおいて、同じような処理を何度も書いていると、コードが長くなり、読みにくくなってしまいます。そんな問題を解決するのが**「自作関数」**です。
処理を一つのまとまりとして関数化することで、コードの再利用性が高まり、プログラム全体が整理されて見やすくなります。この記事では、C言語で自作関数を定義し、使うための基本的なルールを分かりやすく解説します。
自作関数の基本的な作り方と呼び出し方
関数は、特定のタスクを実行するための「小さなプログラム」のようなものです。まずは、その基本的な構成要素を見ていきましょう。
関数の定義
戻り値の型 関数名(引数の型 仮引数名1, 引数の型 仮引数名2, ...) {
// 関数の処理
...
return 戻り値; // 戻り値の型が void でなければ必須
}
- 戻り値の型 (Return Type): 関数が処理を終えた後に、呼び出し元に返す値のデータ型です。値を返さない場合は
void
と書きます。 - 関数名 (Function Name): 関数の役割がわかるような、自由な名前を付けます。
- 引数 (Parameters): 関数が処理を行うために、呼び出し元から受け取る値です。不要な場合は
(void)
と書きます。 - return文: 関数の処理を終了し、呼び出し元に値を返します。
サンプルコード:簡単な足し算関数
2つの整数を受け取って、その合計を返す add_two_numbers
という関数を作ってみましょう。
#include <stdio.h>
// 2つの整数を足し算する関数
int add_two_numbers(int num1, int num2) {
int sum = num1 + num2;
return sum; // 計算結果の sum を返す
}
int main(void) {
int result;
// add_two_numbers関数を呼び出し、戻り値を受け取る
result = add_two_numbers(10, 20);
printf("計算結果: %d\n", result); // 30 が表示される
result = add_two_numbers(5, 3);
printf("計算結果: %d\n", result); // 8 が表示される
return 0;
}
このように、一度関数を定義すれば、異なる値で何度も呼び出して使うことができます。
関数から別の自作関数を呼び出す
作成した関数の中から、さらに別の自作関数を呼び出すことも可能です。これにより、処理を細かく部品化し、プログラムを組み立てることができます。
#include <stdio.h>
// ユーザーからの入力を受け取る関数
int get_user_input(void) {
int value;
printf("整数を入力してください: ");
scanf("%d", &value);
return value;
}
// 2つの数値と、ユーザー入力を足し合わせる関数
int calculate_total(int num1, int num2) {
// 自作関数 get_user_input を呼び出す
int user_value = get_user_input();
int total = num1 + num2 + user_value;
return total;
}
int main(void) {
int result;
result = calculate_total(10, 20);
printf("最終的な合計値: %d\n", result);
return 0;
}
関数定義はmain
の前?後?
C言語のコンパイラは、ソースコードを上から下に読み進めます。そのため、関数は呼び出される時点ですでにコンパイラに知られている必要があります。
上記の例では、main
関数より前に関数を定義していたため問題ありませんでした。しかし、main
関数をコードの最初に置きたい場合など、呼び出しより後に関数を定義すると、通常はコンパイルエラーになります。
この問題を解決するのが**「プロトタイプ宣言」**です。
プロトタイプ宣言の使い方
プロトタイプ宣言とは、関数の本格的な定義(処理の中身)を後で書くことをコンパイラに予告する、いわば**「関数の紹介状」**のようなものです。
ファイルの先頭(main
関数の前)に、関数の処理部分 {}
を除いた一行を ;
で終えて記述します。
プロトタイプ宣言の構文: 戻り値の型 関数名(引数の型リスト);
プロトタイプ宣言を使ったサンプルコード
先ほどのプログラムを、プロトタイプ宣言を使って書き換えてみましょう。これにより、main
関数を一番上に配置し、各関数の本体をその下に書くという、読みやすい構成にできます。
#include <stdio.h>
// --- プロトタイプ宣言 ---
// これからこういう関数が登場しますよ、とコンパイラに知らせる
int calculate_total(int num1, int num2);
int get_user_input(void);
// main関数を先に書くことができる
int main(void) {
int result;
result = calculate_total(10, 20);
printf("最終的な合計値: %d\n", result);
return 0;
}
// --- 関数の定義(本体) ---
int calculate_total(int num1, int num2) {
int user_value = get_user_input();
int total = num1 + num2 + user_value;
return total;
}
int get_user_input(void) {
int value;
printf("整数を入力してください: ");
scanf("%d", &value);
return value;
}
大規模なプログラムでは、プロトタイプ宣言をヘッダーファイル (.h
) にまとめて、ソースファイルを整理するのが一般的です。
まとめ
- 関数を使うと、コードの再利用ができ、プログラムが整理される。
- 関数は、戻り値の型、関数名、引数で構成される。
- 関数を呼び出しより後に定義する場合は、プロトタイプ宣言が必要。
自作関数を使いこなすことは、C言語プログラミングにおける大きな一歩です。まずは簡単な処理から関数化する練習を始めてみましょう。