Назад к вопросам
Middle
110
questionbank

Как отключить манглинг имен в C/C++?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

// Отключение манглинга для объявления функции в C++
extern "C" void myFunction();

// Отключение манглинга для блока определений
extern "C" {
    void anotherFunction();
    int globalVariable;
}

В C++ манглинг имен (name mangling) используется компилятором для кодирования информации о типе, пространстве имен и других атрибутах функции или переменной в ее символьном имени. Это необходимо для поддержки перегрузки функций и других возможностей C++.

В языке C манглинг не используется. Поэтому:

  1. Для C кода: Манглинг отключен по умолчанию.
  2. Для 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.