Когда ты линкуешь C++ программу с C функциями, надо использовать спецификацию linkage extern "C". Она говорит компилятору C++, чтобы он рассматривал объявления внутри как C функции, а не как C++ функции.
C++ использует фичу под названием name mangling, чтобы поддерживать перегрузку функций. Компилятор кодирует сигнатуры функций в их внутренние имена, что делает их несовместимыми с более простой схемой именования в C. Например:
void func(int); // Изменённое имя: _Z4funci
void func(double); // Изменённое имя: _Z4funcdi
C не изменяет имена, поэтому линкер не может сопоставить вызовы C++ с определениями C функций.
Спецификация extern "C" отключает name mangling для объявлений внутри. Это гарантирует, что компилятор C++ генерирует вызовы функций, используя соглашение об именовании C.
Оборачивай объявления C функций в своём C++ коде:
extern "C" {
void c_function(int x);
int c_add(int a, int b);
}
Или используй это для отдельных объявлений:
extern "C" void c_function(int x);
Когда ты создаёшь заголовки, которые будут использоваться и C, и C++, применяй условную компиляцию:
#ifdef __cplusplus
extern "C" {
#endif
void c_function(int x);
#ifdef __cplusplus
}
#endif
Такой подход гарантирует, что C объявления правильно обрабатываются независимо от того, компилируется ли код как C++ или включается в C проекты, сохраняя совместимость между обоими языками.
Спецификация extern "C" включает name mangling для функций C++ и делает их совместимыми с C linkers.
Новый — ещё не проверен сообществом
Вы