Механизм extern "C" предоставляет возможность взаимодействия с кодом на языке C. Это позволяет использовать C-библиотеки и облегчает связь между C++ и другими языками.
История вопроса: С самого начала язык C++ был построен на основе C, однако имел свои особенности, включая 'name mangling', для поддержки перегрузки функций и других фишек.
Проблема: Имя функции в C++ компилируется в символ с дополнительной структурой (mangled), но в C такой трансформации нет. В результате невозможно просто подключить заголовок C кода к C++ компилятору без дополнительных усилий.
Решение:
Обёртывание функций в конструкцию extern "C" запрещает 'name mangling', делая их видимыми для кода, собранного C-компилятором.
Пример кода:
#ifdef __cplusplus extern "C" { #endif void foo(int); #ifdef __cplusplus } #endif
Ключевые особенности:
Можно ли перегружать функции с extern "C"?
Нет, перегрузка невозможна, так как используется стандартное C-имя функции.
Что произойдёт, если объявить шаблонную функцию как extern "C"?
Ошибка компиляции, так как шаблоны — отдельная фича C++ и не поддерживаются в C.
Можно ли использовать extern "C" на уровне отдельного класса?
Нет, только для функций и переменных, не для классов или методов.
C++ проект подключает стороннюю C-библиотеку без extern "C", затем код не линкуется из-за несовпадения имён символов.
Плюсы:
Минусы:
Используется extern "C" в заголовочных файлах при интеграции сторонних C-библиотек.
Плюсы:
Минусы: