extern - может применяться к объявлению глобальной переменной, функции или шаблона, оно указывает, что символ имеет внешнюю компоновку. Может иметь 4 значения:
1) Для не константной переменной указывает что она определена в другой единице трансляции. Должно указываться в каждом файле где используется переменная.
// file1
int i = 10; // Определена переменная i (только один раз)
// file2
extern int i; // Говорит что i определена в другом файле
i = 20; // Использование i
// file3
extern int i; // Говорит что i определена в другом файле
int a = i; // Использование i
2) Константные (const) переменные имеют внутреннюю компоновку по умолчанию. Ключевое слово extern, перед const, говорит что будет применена внешняя компоновка, необходимо во всех файлах использовать ключевые слова extern const
// file1
extern const int i = 10; // Определена переменная (только один раз)
// file2
extern const int i; // Говорит что i определена в другом файле
int a = i; // Использование i
// file3
extern const int i; // Говорит что i определена в другом файле
int b = i + 5; // Использование i
3) extern "C" указывает, что функция определена в другом месте и использует соглашение о вызовах языка C. Модификатор extern "C" также может применяться к нескольким объявлениям функций в блоке.
4) В объявлении шаблона указывает, extern что экземпляр шаблона уже создан в другом месте. extern сообщает компилятору, что он может повторно использовать другой экземпляр, а не создавать новый в текущем расположении.