c
В C++ манглинг имен (name mangling) используется компилятором для кодирования информации о типе, пространстве имен и других атрибутах функции или переменной в ее символьном имени. Это необходимо для поддержки перегрузки функций и других возможностей C++.
В языке C манглинг не используется. Поэтому:
extern "C".Этот спецификатор указывает компилятору C++, что символы (функции или переменные), объявленные внутри блока или непосредственно с ним, должны использовать соглашение о именах и вызовах, соответствующее C. Это позволяет компоновщику C++ находить функции и переменные, экспортированные из библиотек или объектов, скомпилированных C компилятором, или наоборот.
Примеры применения extern "C":
| Назначение | Синтаксис | Описание |
|---|---|---|
| Одно объявление функции | extern "C" void func(); | Отключает манглинг для конкретной функции. |
| Блок объявлений/определений | c++<br/>extern "C" {<br/> // ...<br/>}<br/> | Отключает манглинг для всех символов внутри блока. Часто используется в заголовочных файлах для обеспечения совместимости с C. |
| Определение функции | extern "C" void func() { /* ... */ } | Применяется к определению функции для гарантии, что имя в объектном файле не будет манглировано. |
| Объявление/определение переменной | extern "C" int var; | Применяется к переменной. |
Обычно extern "C" используется в заголовочных файлах совместно с макросом __cplusplus для условного включения спецификатора компоновки только при компиляции кода как C++.
c
Это позволяет использовать my_c_header.h как в C, так и в C++ проектах без ошибок компоновки. При компиляции C++ компилятор увидит extern "C", а при компиляции C — нет, что соответствует стандартному поведению C.