Директива extern подключает внешний ресурс (переменную, структуру и т.д. ) , определенный и скомпилированный в другом файле. То есть extern работает уже на этапе сборки (компоновки).
Интересный полезный пример использования extern для объявления глобальных переменных ( к примеру строковых).
Можно использовать #define str "blablabla", но как оказывается define наплодит столько раз в памяти "blabla" сколько раз будет появляться в коде str.
Так вот при использовании extern "blablabla" будет один раз размещена в памяти (а ссылаться на нее можно многократно) и делается это так:
H файл:
extern char * str
c файл:
char * str = "blablabla"
extern "C"
extern "C" используется для указания , что функция в собираемой библиотеке будет не cpp типа , а типа С.
Это актуально, когда в проекте на с++ добавляются сторонние "старые" библиотеки , например openssl .