extern

Сразу надо сказать, что extern достался от языка С и вроде бы лучше уже избегать extern применения.

Наверное правильнее будет отказаться от extern и выйти из положения по другому: глобальные константы в т.ч. строковые

Директива extern подключает внешний ресурс (переменную, структуру и т.д. ) , определенный и скомпилированный в другом файле. То есть extern работает уже на этапе сборки (компоновки) (сборка с++ файлов).

Интересный полезный пример использования extern для объявления глобальных переменных ( к примеру строковых).

Можно использовать #define str "blablabla", но как оказывается define наплодит столько раз в памяти "blabla" сколько раз будет появляться в коде str.

Так вот при использовании extern "blablabla" будет один раз размещена в памяти (а ссылаться на нее можно многократно) и делается это так:

#ifndef MY_DEF_TEST_H
#define MY_DEF_TEST_H
namespace myDef1
{
     extern char* PAR1;
}
#endif // MY_DEF_TEST_H
#include "my_def_test.h"
namespace myDef1
{
    char* PAR1 = "blablabla";
}
main(){
......
qDebug() << " myDef1::PAR1 " << myDef1::PAR1 ;

extern "C" используется для указания , что функция в собираемой библиотеке будет не cpp типа , а типа С.

Это актуально, когда в проекте на с++ добавляются сторонние "старые" библиотеки , например openssl .