В C++ все функции должны иметь прототипы, а в языке C прототипы формально необязательны, но весьма желательны. Общая форма прототипа такова:

<тип_результата> <имя_функции>(<список_параметров>);

По сути, прототип - это просто объявление типа возвращаемого значения, имени и списка параметров функции, завершающееся точкой с запятой.
Пример 1
// Пример прототипа функции fn()
float fn(float x); // прототип
{
// Определение функции
}
Чтобы задать прототип функции, которая принимает переменное количество аргументов, следует поставить три точки в том месте, с которого начинается список, состоящий из переменного числа параметров
Пример 2
int printf(const char *format, ...);
Компилятор C++ позволяет объявлять более одной функции под одним и тем же именем, если у них различные списки аргументов.
При задании прототипа для перегруженной функции каждая версия этой функции должна иметь собственный прототип. При объявлении функции-члена внутри своего класса используется прототип этой функции.
В C для задания прототипа функции, не имеющей параметров, вместо списка параметров используется ключевое слово void.
В C++ пустой список параметров в прототипе функции означает, что функция не имеет параметров. Слово void в этом случае необязательно. Его использование в данном контексте разрешено, но излишне.
Пример 3
int f(void); // в С
int f(); // в С++

Пример 4
int slice();
int main()
{
...
slice(20, 50);
}

int slice(int a, int b)
{ ... }
slice(int, int)