関数のプロトタイプとは、本質的には、関数の実際の宣言の前に置かれる、関数の*取り除かれた*宣言のことである。例えば、次のコードを見てほしい：
```c
#include <stdio.h>

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

int sum(int x, int y) {
  return x + y;
}
```
よく見ると、`main`関数の中で、`sum`は1つの引数でしか呼び出されていないことに気づくだろう。多くのコンパイラーはこのコードを喜んでコンパイルするだろう。例えば、gccは「関数'sum'の暗黙の宣言 [-Wimplicit-function-declaration]`」という警告を出しますが、動作する実行ファイルを生成します。
このような呼び出しが発生した場合、対象となる引数(この場合は `y`) は未定義であり、スタック(32ビットシステムの場合)またはレジスタ(64ビットシステムの場合)上の値である可能性が高い。
この挙動を避けるには、ファイルの先頭（実際には、`main`のような潜在的な呼び出し元より上であれば、場所は重要ではない：
```c
#include <stdio.h>

int sum(int, int); // This is the function prototype!

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

int sum(int x, int y) {
  return x + y;
}
```
int sum(int x, int y)`が`int sum(int, int)`になっている。さて、このコードをgccでコンパイルしようとすると、「too few arguments to function 'sum'`」というエラーが出て、実行ファイルは生成されない。

関数プロトタイプはC言語の本当に重要な機能であり、デバッグの手間を省くために常に使うべきである。
A function prototype is essentially a *stripped* declaration of a function that goes before the actual declaration of the function. For example, look at this piece of code:
```c
#include <stdio.h>

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

int sum(int x, int y) {
  return x + y;
}
```
If you look closely, you'll notice that, in the `main` function, `sum` is only called with one argument. Many compilers would happy compile this code, perhaps with a warning. For example, gcc will give you the warning `implicit declaration of function 'sum' [-Wimplicit-function-declaration]`, but proceed to yield a working executable.
When such call happens, the argument of interest(`y`, in this case), is undefined, and is likely a value on the stack(on 32-bit systems) or in one of the registers(on 64-bit system).
To avoid this behavior, you can add a **function prototype** at the top(the location actually doesn't matter, as long as its above potential callers, such as `main`!) of the file, like so:
```c
#include <stdio.h>

int sum(int, int); // This is the function prototype!

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

int sum(int x, int y) {
  return x + y;
}
```
As you can see, the function prototype is indeed just a stripped declaration: `int sum(int x, int y)` was turned into `int sum(int, int)`. Now, if we try compiling this code using gcc, we'll get the error `too few arguments to function 'sum'`, and no executable will be generated.

Function prototypes are a really important feature of C and should always be used to save hours of potential debugging.