Это очень опасная практика - нет гарантии, что прототип соответствует фактической функции, и если она не соответствует, всевозможные вещи могут пойти не так. Особенно код, который фактически реализует эти функции, не увидит это заявление, что делает его опасным.
Правильный способ сделать это состоял бы в том, что автор двух функций помещает свои объявления в заголовочный файл, а файл с их использованием должен включать этот заголовочный файл. Как правило, каждая функция C должна быть либо статической, либо должна быть объявлена в файле заголовка.
Если код написан так, это делается из лени и, возможно, из желания заложить ловушки для будущих разработчиков. Вы также можете видеть, что декларации используют устаревший стиль: extern func1() означает, что func1 возвращает int (по умолчанию) и что он принимает неизвестное, но фиксированное количество параметров. Поэтому вы (и компилятор) даже не знаете, как это назвать.
Допустим, функция была реализована в виде
int func1 (int arg)
и реализатор решил, что должен быть изменен на
void func1 (int arg, int* result)
возвращает значение через указатель, а не в качестве результата функции. Странная декларация будет гарантировать, что компилятор не сможет обнаружить это и вызвать func1 после того, как изменение, скорее всего, произойдет сбой, или, что еще хуже, переопределить случайный int где-то в вашем приложении. Это катастрофа в ожидании. Если вы видите такой код в своем приложении, исправьте его немедленно.
Лично я считаю, что эти декларации - плохая идея. Другие люди согласны со мной, потому что gcc имеет возможность предупреждать о них: '-Wnested-externs'. – melpomene
Я хочу знать преимущества такого рода практики. @ Maharaj –
Почему бы и нет? Возможно, вам это не понравится, но это законно. C. – EJP