Middle
81
questionbank

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

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech
c

В 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++.

c

Это позволяет использовать my_c_header.h как в C, так и в C++ проектах без ошибок компоновки. При компиляции C++ компилятор увидит extern "C", а при компиляции C — нет, что соответствует стандартному поведению C.