fall and fall

ゲーム、プログラミング、二次創作のことなどを書いています。

C言語 関数の定義位置(プロトタイプ宣言とヘッダファイル)

C言語の関数を定義する位置について書いていきます。プロトタイプ宣言とヘッダファイルの使用方法も記載しています。

1. 関数の定義位置

C言語の場合、関数は呼び出す前に定義します。

main.c

#include <stdio.h>

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

int main() {
  int sum = add(1, 2);
  printf("sum=%d\n", sum);
  return 0;
}

呼び出し元の後に書くと警告が出ました。

2. プロトタイプ宣言

関数を呼び出す前に、以下のプロトタイプ宣言をすることができます。

戻り値 関数名(引数);

プロトタイプ宣言をすると、関数の実体を呼び出し元の後に書くことができます。宣言の引数は、型だけでも大丈夫です。

main.c

#include <stdio.h>

int add(int, int);

int main() {
  int sum = add(1, 2);
  printf("sum=%d\n", sum);
  return 0;
}

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

3. ヘッダファイルを使う方法

別ファイルに関数を定義する際は、ヘッダファイルを使います。

3.1. 呼び出される側

add.h

#ifndef _ADD_H_
#define _ADD_H_

// プロトタイプ宣言
int add(int, int);

#endif

上のヘッダファイルは、多重インクルードを防止しています。

add.c

#include "add.h"

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

3.2. 呼び出し側

main.c

#include <stdio.h>
#include "add.h"

int main() {
  int sum = add(1, 2);
  printf("sum=%d\n", sum);
  return 0;
}

補足. 関数を後ろに定義した場合

Visual Studio で、関数を呼び出し元より後に定義するケースを試してみました。

main.c

#include <stdio.h>

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

int main() {
  int sum = add(1, 2);
  printf("sum=%d\n", sum);
  return 0;
}

実行はできたのですが、ビルドで以下の警告が出力されました。

main.c(4,13): warning C4013:
関数 'add' は定義されていません。
int 型の値を返す外部関数と見なします。