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 型の値を返す外部関数と見なします。