Я хочу реализовать проект в С, но удобно кодировать какую-то часть проекта в C ++ а затем позвонить им с главного С код.
Является ли это возможным?! если да, то как я могу это сделать ?!
заранее спасибо 🙂
Постскриптум
Я использовал несколько библиотек в моем C ++ Код такой как OpenCV.
Вам нужно будет «обернуть» ваш интерфейс C ++ обычными функциями C, которые принимают параметр, чтобы указать, к какому объекту они будут вызваны. Например, если у вас есть в C ++
class A
{
// .. boilerplate stuff...
int SomeMethod(int n, float f);
};
Затем, наряду с этим, вы можете объявить функцию, такую как
extern "C" int A_SomeMethod(void* Obj, int n, float f)
{
return(((A*)Obj)->SomeMethod(n, f));
}
Если вас не устраивает приведение пустоты *, вы можете реализовать какую-то карту от непрозрачного маркера до A*
, Но суть в том, что вам нужно держать в руках некоторый указатель / указатель на объект, для которого будет вызван метод. Чтобы получить указатель / дескриптор, вам нужно обернуть выделение в:
extern "C" void* A_Instantiate()
{
return new A;
}
Файлы C ++ должны быть скомпилированы отдельно вместе с файлом с функциями выше. Отдельное включение для компиляции C должно включать объявления всех функций, перечисленных выше.
РЕДАКТИРОВАТЬ: предостережения и комментарии ниже важны; ответить на вопрос: «Да, можно вызвать C ++ из C», и это один из подходов. Это не полный подход, поскольку на самом деле нет механистического способа сделать это, но это начало. Кроме того, не забудьте создать еще один вызов для delete
и т. д. и т. д.
В: Могу ли я получить доступ к своему C-коду из C ++ или наоборот?
A: Да.
1) Главное использовать extern "C" { ...}
во всех ваших заголовках обозначать функции и данные только для C, например:
http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B
/* Header file foo.h */
#ifdef __cplusplus /* If this is a C++ compiler, use C linkage */
extern "C" {
#endif
/* These functions get C linkage */
void foo();
struct bar { /* ... */ };
#ifdef __cplusplus /* If this is a C++ compiler, end C linkage */
}
#endif
2) Обычный сценарий — это основная программа на C ++, которая вызывает сочетание функций и структур C и C ++. Все структуры и функции объявлены в заголовках, и все имеют «#ifdef __cplusplus / extern C».
3) Вот хороший FAQ по смешиванию C и C ++:
Если не строго требуется, это только для мазохистов. Это потребует особой осторожности с обеих сторон, и сегодня вполне может сработать и эффектно взорваться со следующим обновлением компилятора. C ++ требует большой помощи во время выполнения, и для надежной работы с C это обычно не поддерживается. Вы можете позвонить в C из C ++, который официально поддерживается (и является частью стандарта, extern "C"
и тому подобное).
Вероятно, лучше всего написать свой C в подмножестве, обработанном C и C ++ (отправная точка на тонких различиях этот) и скомпилировать с помощью компилятора C ++. Или преодолеть это и решить, какой язык вам нравится больше всего.
да, нужно указать это как
внешний «С»
таким образом, функция получит связь «C», тогда код C может вызывать вашу функцию так же, как если бы она была в C. Это имя функции не будет искажено, потому что C не поддерживает перегрузку.
здесь позвольте мне привести @Faisal Vali: