C и C ++ очень совместимы;вызов кода C из C ++ тривиален;однако вызов кода C ++ из C более ограничен, поскольку интерфейс должен иметь связь C и содержать только типы, доступные в C, и не может использовать специфические функции C ++, такие как аргументы по умолчанию или перегрузка функций, например.
Использование кода C ++ вC требует, чтобы у интерфейса была extern "C"
спецификация связи, которая сама по себе недопустима C, поэтому спецификация в любом заголовочном файле должна быть условной, например:
// interop.h
#if !defined INTEROP_H
#define INTEROP_H
#if defined __cplusplus
extern "C"
{
#endif
// C interface here
void somefunction() ;
#if defined __cplusplus
}
#endif
#endif // INTEROP_H
Тогда реализация самого интерфейса будетКод C ++:
// interop.cpp
#include "interop.h"
void somefunction()
{
// C++ code here callable from C through somefunction()
}
Но интерфейс вызывается из кода C:
// notcpp.c
#include "interop.h"
int main()
{
somefunction() ;
}
Этот подход хорош, когда интерфейс прост, например, если вы используете Boost Date /Библиотека времени для какой-то очень специфической процедуры, результаты которой могут быть представлены в C, тогда это может быть целесообразным, если реализация эквивалентной функциональности только в C будет непомерной.Но создание оболочек C для целых классов C ++ отнимает много времени, подвержено ошибкам, негибко и, в конечном счете, бессмысленно - в общем случае проще будет скомпилировать ваш C-код как C ++, тогда барьер взаимодействия исчезнет, поскольку вы сможете затем ввести специфический для C ++ код непосредственно в существующую кодовую базу.(хотя после этого он никогда не будет скомпилирован как C).C ++ является мультипарадигмой и включает библиотеку C в свою собственную библиотеку C ++, а большинство сторонних заголовков и библиотек OS C уже включают в себя оболочку условных связей C C ++, поэтому вам не нужно переписывать весь код в стиле ООП, чтобыиспользуйте C ++, если вы хотите воспользоваться преимуществами большей библиотечной экосистемы.