Как я могу получить доступ к моей функции C ++ в моем коде C или наоборот?

Я хочу реализовать проект в С, но удобно кодировать какую-то часть проекта в C ++ а затем позвонить им с главного С код.
Является ли это возможным?! если да, то как я могу это сделать ?!
заранее спасибо 🙂

Постскриптум
Я использовал несколько библиотек в моем C ++ Код такой как OpenCV.

6

Решение

Вам нужно будет «обернуть» ваш интерфейс 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и т. д. и т. д.

4

Другие решения

В: Могу ли я получить доступ к своему 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 ++:

http://www.parashift.com/c++-faq/mixing-c-and-cpp.html

0

Если не строго требуется, это только для мазохистов. Это потребует особой осторожности с обеих сторон, и сегодня вполне может сработать и эффектно взорваться со следующим обновлением компилятора. C ++ требует большой помощи во время выполнения, и для надежной работы с C это обычно не поддерживается. Вы можете позвонить в C из C ++, который официально поддерживается (и является частью стандарта, extern "C" и тому подобное).

Вероятно, лучше всего написать свой C в подмножестве, обработанном C и C ++ (отправная точка на тонких различиях этот) и скомпилировать с помощью компилятора C ++. Или преодолеть это и решить, какой язык вам нравится больше всего.

0

да, нужно указать это как

внешний «С»

таким образом, функция получит связь «C», тогда код C может вызывать вашу функцию так же, как если бы она была в C. Это имя функции не будет искажено, потому что C не поддерживает перегрузку.

здесь позвольте мне привести @Faisal Vali:

  • extern «C» является спецификацией связи
  • Каждый компилятор требуется обеспечить связь «C»
  • спецификация связи должна встречаться только в области имен
  • все типы функций, имена функций и имена переменных имеют языковую связь
  • два типа функций с разными языковыми связями — это разные типы, даже если они идентичны
  • гнездо спецификаций связи, внутреннее определяет окончательную связь
  • extern «C» игнорируется для членов класса
  • не более одной функции с конкретным именем может иметь связь «C» (независимо от пространства имен)
  • extern «C» заставляет функцию иметь внешнюю связь (не может сделать ее статической)
  • Связь с C ++ с объектами, определенными в других языках, и с объектами, определенными в C ++ из других языков, определяется реализацией и зависит от языка. Только в тех случаях, когда стратегии размещения объектов двух языковых реализаций достаточно похожи, такая связь может быть достигнута

см. ответ Фейсала Вали здесь

0
По вопросам рекламы [email protected]