関数宣言と定義の違いとは?なぜ必要なのかを初心者向けに解説

C言語で関数を学び始めると、最初に出てくるのが「関数宣言」と「関数定義」です。

なんとなく書いて動いているけど、
「宣言って何?なくてもよくない?」と感じたことはないでしょうか。

この記事では、関数宣言と関数定義の違いと、なぜ宣言が必要なのかを、実際の動作イメージとともにわかりやすく解説します。


C言語文法解説シリーズ

本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。

C言語文法解説シリーズ一覧はこちら

目次

関数とは何か(おさらい)

関数とは、処理をひとまとまりにしたものです。

C
int add(int a, int b) {
    return a + b;
}

このように定義しておくことで、何度でも同じ処理を呼び出すことができます。

関数の基本についてはこちらの記事で解説しています。


関数宣言と関数定義の違い

まず結論から整理します。

用語役割
関数宣言関数の「存在」と「型」をコンパイラに伝える
関数定義実際の処理内容を書く

型についてはこちらの記事で解説しています。


■ 関数宣言とは

関数宣言は「こういう関数があります」と事前に知らせるためのものです。

C
int add(int a, int b);

これだけでは処理は書かれていません。
あくまで「関数の情報だけ」を伝えています。


■ 関数定義とは

関数定義は、実際に処理を書く部分です。

C
int add(int a, int b) {
    return a + b;
}

こちらが本体です。


なぜ関数宣言が必要なのか

ここが一番重要なポイントです。

C言語は「上から順番に読む言語」です。
つまり、コンパイラは未来を見てくれません。


■ 宣言がないとどうなるか

C
int main() {
    int result = add(1, 2);
    return 0;
}

int add(int a, int b) {
    return a + b;
}

このコードはエラーになります。

理由はシンプルで、
mainの時点でaddという関数を知らないからです。


■ 宣言を追加するとどうなるか

C
int add(int a, int b);  // ← これが宣言

int main() {
    int result = add(1, 2);
    return 0;
}

int add(int a, int b) {
    return a + b;
}

これでコンパイルが通ります。


初心者さん

後で書くんだから、別に知らなくてもよくないですか?

エンジニアくん

C言語は未来を見ないんだ。呼び出す時点で“知っている必要がある”んだよ


コンパイルの仕組みと関数宣言

少し踏み込むと、関数宣言は「型チェック」のためにも重要です。

例えば:

C
int add(int a, int b);

この宣言があることで、

  • 引数はintが2つ
  • 戻り値はint

という情報がコンパイラに伝わります。


■ 宣言がないと危険なケース

昔のCでは、宣言なしで関数を呼べてしまうことがありました。

C
int main() {
    double result = add(1.5, 2.5);  // 本当はdouble
}

もし実際の関数が int add(int, int) だった場合、
型の不一致が検出されず、バグの原因になります。

👉 宣言は「安全に使うための契約」でもあります。


実務での使われ方(ファイル分割)

実際の開発では、関数宣言はヘッダファイル(.h)に書きます。

add.h
int add(int a, int b);
add.c
int add(int a, int b) {
    return a + b;
}
main.c
#include "add.h"int main() {
    int result = add(1, 2);
}

このように分割することで、

  • 複数ファイルから利用できる
  • 役割ごとに整理できる

というメリットがあります。


まとめ

  • 関数宣言は「関数の情報を先に伝えるもの」
  • 関数定義は「実際の処理を書くもの」
  • C言語は上から読むため、宣言がないと呼び出せない
  • 宣言は型チェックの役割もあり、安全性に重要

この記事が参考になった方へ

関数を含むC言語の基本文法をこちらの記事で整理しています。

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

組み込みソフトエンジニアとして働きながら、
C言語・メモリ・ポインタなどの基礎から実務まで解説しています。

副業・キャリアについても実体験ベースで発信中です。

X(旧Twitter)でも発信しています
👉 Xはこちら

▼まずはここから読むのがおすすめ
C言語文法シリーズ
メモリ領域解説シリーズ

コメント

コメントする


目次