`extern "C" используется для обозначения того, что функции и переменные С++ должны иметь C-ссылку вместо С++-связи, позволяя C-и С++-модулям взаимодействовать друг с другом. Тег extern-c должен использоваться только на вопросах С++, где предметом обсуждения является поведение деклараций с "extern "C".

тег на вопросы С++, где предметом обсуждения является поведение кода с extern "C", применяемое к объявлениям функций.

Его следует использовать только на вопросах С++ - тег является обязательным; если вопрос не может принять С++, он не должен иметь extern-c. Эти вопросы могут быть отмечены c также, как правило, не очень хорошая идея, но эти вопросы касаются взаимодействия с C-кодом. c не требуется.

extern "C" используется, чтобы указать, что С++-функции и переменные должны иметь C-связь вместо С++-связи, позволяя C и С++-модулям взаимодействовать друг с другом; в частности, он применяет связь C с типами функций, именами функций и именами переменных.

  • Типы функций с C linkage представляют собой соглашение о вызовах и заставляют компилятор использовать соглашения C-вызова вместо С++ (если применимо); это не зависит от имен функций с C-связью. Это также позволяет указателям функций указывать, указывают ли они на функции C или С++.

    typedef void CppFunc();          // void() C++ function type.
    extern "C" typedef void CFunc(); // void() C function type.
    
    CppFunc* cppCppFuncPtr;          // Pointer with C++ linkage, to function with C++ linkage.
    extern "C" CppFunc* cCppFuncPtr; // Pointer with C linkage, to function with C++ linkage.
    CFunc* cppCFuncPtr;              // Pointer with C++ linkage, to function with C linkage.
    extern "C" CFunc* cCFuncPtr;     // Pointer with C linkage, to function with C linkage.
    
  • Имена функций и переменных с C-связью представляют собой изменение имени; это не зависит от типов функций с C-связью. Имена C могут быть минимальными или неменоваться, в зависимости от компилятора; наиболее известным примером этого является то, что MSVC добавляет информацию о соглашениях о вызовах к именам функций C и ведущее подчеркивание к именам переменных C.

Объявление функций как extern "C" позволяет модулям С++ определять функции, которые могут быть вызваны из модулей C, и модули С++ для подключения к функциям, определенным в модулях C. Аналогично, объявляя переменные global или namespace как extern "C", С++ модули могут определять переменные, которые могут использоваться в модулях C, и модули С++ для подключения к переменным, определенным в модулях C. [Объявления участника класса всегда имеют ссылку на С++, даже если объявления появляются внутри блока extern "C".]

extern "C" заставляет компилятор обрабатывать функции и переменные extern "C" так, как если бы они были все в одном и том же пространстве имен при компиляции, независимо от их фактического пространства имен; две объявления функции extern "C" с тем же неквалифицированным именем или две переменные extern "C" с тем же именем, всегда ссылаются на один и тот же объект, независимо от того, находятся ли они в одном и том же пространстве имен или нет. Аналогично, функция extern "C" не может иметь то же имя, что и переменная extern "C", независимо от того, находятся ли они в одном и том же пространстве имен или нет. Фактически, он применяет алгоритм компиляции C к объявлению вместо алгоритма С++, генерируя символ, идентичный тому, что функция или переменная была в модуле C.

extern "C" функции могут содержать код С++ внутри них и будут выполняться правильно, даже если вызывается из кода C.

Подробнее о связи и extern "C" см. страница cppreference