Если я правильно понимаю, это означает
extern void foo();
что функция foo объявлена в другой единицы перевода.
1) Почему не просто # включить заголовок, в котором объявлена эта функция?
2) Как линкер знает, где искать функцию при связывании времени?
edit: Возможно, мне следует пояснить, что после этого вышеприведенного объявления следует использовать функцию
foo();
В этой единицы перевода никогда не определяется.