Поскольку C ++ поддерживает перегрузку функций, компилятор C ++ должен убедиться, что компоновщик видит два разных имени для void foo(int)
и void foo(float)
.Наиболее распространенный способ сделать это - закодировать информацию о параметрах в имена, представленные компоновщику.Поскольку C не перегружен, компилятору также нет необходимости включать информацию о параметрах в имена, представленные компоновщику.
Если вы сейчас наивно пытаетесь связать объектный файл C и C ++,компоновщик не сможет разрешить все имена, потому что объектные файлы используют другую схему именования для имен, которые им нужны и / или экспортируются.
Поскольку довольно часто используется код C из C ++В программе C ++ есть механизм, сообщающий компилятору, что некоторые функции должны использовать схему именования C вместо схемы C ++: эти функции объявляются как extern "C" int bar()
или, если у вас есть набор функций C:
extern "C" {
/* Function declarations here */
}
И там, где написано «Объявления функций здесь», вы можете просто использовать #include
для извлечения заголовка C (хотя бесконечно лучше подготовить сам заголовок для использования как в C, так и в C ++).
Чтобы подготовить заголовок для использования в C и C ++, сначала убедитесь, что он не использует ключевые слова, специфичные для C ++ (например, class
или new
), иru Вы можете добавить в заголовок следующую мантру:
/* Include guard goes here */
#ifdef __cplusplus
extern "C" {
#endif
/* original content of the header */
#ifdef __cplusplus
}
#endif
/* #endif of the include guard here */