Как отключить манглинг имен в C/C++?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
// Отключение манглинга для объявления функции в C++
extern "C" void myFunction();
// Отключение манглинга для блока определений
extern "C" {
void anotherFunction();
int globalVariable;
}
В C++ манглинг имен (name mangling) используется компилятором для кодирования информации о типе, пространстве имен и других атрибутах функции или переменной в ее символьном имени. Это необходимо для поддержки перегрузки функций и других возможностей C++.
В языке C манглинг не используется. Поэтому:
- Для C кода: Манглинг отключен по умолчанию.
- Для 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++.
// my_c_header.h
#ifndef MY_C_HEADER_H
#define MY_C_HEADER_H
#ifdef __cplusplus
extern "C" {
#endif
// Функции и переменные, написанные на C
void c_function();
int c_variable;
#ifdef __cplusplus
}
#endif
#endif /* MY_C_HEADER_H */
Это позволяет использовать my_c_header.h как в C, так и в C++ проектах без ошибок компоновки. При компиляции C++ компилятор увидит extern "C", а при компиляции C — нет, что соответствует стандартному поведению C.