Языку C не важно, что вы называете исходными файлами и файлами заголовков. Вы можете использовать любые имена, которые примет ваш компилятор, и поместить любую функцию в любой файл .c, который вы пожелаете. Некоторые другие инструменты могут заботиться, но язык - нет. Действительно, языку не важно, если вы назовете свой исходный файл bar.source вместо foo.c (но, опять же, ваш компилятор может).
extern сообщает компилятору, что переменная не определена в этом модуле компиляции (файл .c плюс все заголовки, которые он включает), но где-то еще. Вам в основном нужно использовать его только при обращении к глобальной переменной, определенной в каком-то другом модуле компиляции. Вы можете также использовать его с функциями, но это неявно, поэтому не нужно.
Синтаксис, который вы показываете, является действительно старым синтаксисом для определения функций. Он использовался до первого стандарта С, до конца 1980-х годов. Не используйте его больше. Правила обработки типов аргументов архаичны и излишне сложны, а использование объявлений и определений функций нового стиля устраняет все плохое.
Ваш пример лучше записать как:
int function(int param1, int *param2, char param3)
{
function body
}
Единственная проблема заключается в том, что функции старого стиля не могут передавать char
в качестве аргумента, поэтому последний параметр должен действительно быть int param3
.