Возможный дубликат:
Сочетание C ++ и C — как работает #ifdef __cplusplus?
Я сталкиваюсь со следующими строками во многих библиотеках; для чего они хороши? Когда / где __cplusplus
определены?
#ifdef __cplusplus
extern "C" {
#endif
//...
#ifdef __cplusplus
}
#endif
__cplusplus
определяется для кода C ++. Иногда случается, что вам приходится смешивать код C и код C ++. Для этого может быть много причин, например, у вас давно написан драйвер на C, который вы хотите использовать в своем новом проекте C ++ 0x.
У каждого типа функции и имени есть языковая связь. Существует различие между функциями C и AD C ++, поскольку в C нет перегрузки имен функций, имя функции может служить уникальным идентификатором в C, но не может использоваться в C ++. Это называется калечащие функции.
Поскольку вам не нужно искажать имя в C, используя extern "C"
заставит компилятор пропустить добавление информации о параметрах для связывания.
Стандарт C ++ прямо заявляет в 7.5 параграфе 3:
Каждая реализация должна предусматривать связь с функциями, написанными на
язык программирования C, «C», и связь с функциями C ++, «C ++».
complex sqrt(complex); //C++ linkage by default
extern "C" {
double sqrt(double);//C linkage
}
Других решений пока нет …