Описание тега extern-c
ЕхЬегп-с тег должен быть использован на вопросы C++, где предметом обсуждения является поведение кода сextern "C"
применяется к объявлениям функций.
Его следует использовать только в вопросах C++ - тег C++ является обязательным; если вопрос не может принять тег C++, он также не должен иметь тега extern-c. Эти вопросы также могут быть помечены c, что, как правило, не очень хорошая идея, но эти вопросы касаются взаимодействия с кодом C. С тегом не требуется.
extern "C"
используется, чтобы указать, что функции и переменные C++ должны иметь связь C вместо связи C++, что позволяет модулям C и C++ взаимодействовать друг с другом; в частности, он применяет связь C к типам функций, именам функций и именам переменных.
Типы функций со связью C представляют соглашение о вызовах и заставляют компилятор использовать соглашения о вызовах C вместо соглашений C++ (если применимо); это не зависит от имен функций с привязкой 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, а модулям C++ - подключаться к функциям, определенным в модулях C. Точно так же объявление глобальных переменных или переменных пространства имен какextern "C"
позволяет модулям C++ определять переменные, которые могут использоваться в модулях C, а модулям C++ - подключаться к переменным, определенным в модулях C. [Объявления членов класса всегда связаны с C++, даже если объявления появляются внутриextern "C"
блок.]
extern "C"
заставляет компилятор обрабатывать extern "C"
функции и переменные, как если бы они все находились в одном пространстве имен при компиляции, независимо от их фактического пространства имен; дваextern "C"
объявления функций с тем же неполным именем или двумя extern "C"
переменные с одинаковыми именами всегда ссылаются на одну и ту же сущность, независимо от того, находятся они в одном пространстве имен или нет. Точно так жеextern "C"
функция не может иметь то же имя, что и extern "C"
переменная, независимо от того, находятся они в одном пространстве имен или нет. По сути, он применяет к объявлению алгоритм компиляции C вместо алгоритма C++, генерируя символ, идентичный тому, если бы функция или переменная находилась в модуле C.
extern "C"
функциям разрешено содержать в себе код C++, и они будут выполняться правильно, даже если вызываются из кода C.
Для получения дополнительной информации о связях и extern "C"
см. страницу cppreference