передающие указатели от C до C++ и наоборот

Есть ли какие-либо подсказки, которые можно дать мне о передающих указателях на структуры, удваивается, функционирует... от программы C до библиотеки C++ и назад?

5
задан adk 16 January 2010 в 04:39
поделиться

3 ответа

Предполагая, что вы кодируете их в двух разных библиотеках Статические или динамические (DLL в Windows Sharied Biblicies на Linux и другие варианты * NIX) самые большие проблемы, которые у меня есть следующие:

  1. они скомпилированы с тем же компилятором. Хотя это не нужно, если все экспорт C ++ экспортируются с конвенцией именования в стиле C ++, необходимо для вызовов C ++ C ++ к экземплянам классов между двумя модулями C ++. Это необходимо из-за того, насколько различные компиляторы следите в C ++ экспортируют по-разному.

  2. Не бросайте класс C ++ в качестве структуры C. Они не одинаковы под крышками, даже если планировка полей одинаковы. Классы C ++ имеют «V-таблицу», если у них есть какие-либо виртуальные участники; Эта V-таблица позволяет правильному вызову унаследованных или базовых классов методов.

  3. Это верно от C до C или C ++ к C ++, а также C для C ++. Убедитесь, что оба используют одно и то же байтовое выравнивание для выходной библиотеки. Вы можете определить только это, читая документацию о средах компилятора или развития.

  4. Не смешивайте malloc / бесплатно с новым / удалением. Более конкретно не выделяйте память с новой и свободной памятью с «Free» и наоборот. Многие компиляторы и операционные системы обрабатывают управление памятью по-разному между двумя.

  5. Передача указателей функции: пока они подвергаются воздействию / от C ++ как «Extern» C "'' Это должно быть в порядке. (Вам также нужно будет ссылаться на документацию о компиляторах о том, как определить, когда заголовок составляется как C или C ++, чтобы поддерживать это в одном файле, или вам понадобится два отдельных копиях такого же декларации функций в каждом проекте - я Рекомендовать первое)

  6. прохождение удваивает: это встроенный тип в C и C ++, и следует обрабатывать одинаково.

  7. Если вы должны поделиться экземпляром объекта C ++ с функцией C, и действуйте на него в рамках C-кода C, выставляйте набор функций, экспортируемых CLEPER CLEPER, который вызывает соответствующие методы на объекте C ++. Чистый C-код не может правильно вызовать методы на объектах C ++.


    Pseudocode-ish Example:
    // C++ class
    class foo {
       public:
           void DoIt();
    };

    // export helper declarations
    extern "C" void call_doit(foo* pFoo);
    extern "C" foo* allocate_foo();
    extern "C" deallocate_foo(foo* pFoo);


    // implementation
    void call_doit(foo* pFoo)
    {
        pFoo->DoIt();
    }

    foo* allocate_foo()
    {
        return new foo();
    }

    deallocate_foo(foo* pFoo)
    {
       delete pFoo;
    }

    // c consumer
    void main()
    {
        foo* pFoo= allocate_foo();
        call_doit(pFoo);
        dealocate_foo(pFoo);
    }


10
ответ дан 13 December 2019 в 22:08
поделиться
  • не забывать Extern «C» ключевое слово Избегайте проблемы с C ++ Cargling имя.
  • Не используйте пропуск по ссылке типа аргумента, но указатель
0
ответ дан 13 December 2019 в 22:08
поделиться

C и C ++ Указатели одинаковы - указатель в основном указывает на блок памяти, и это не изменяется от C / C ++.

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

Вы имели в виду спросить о вопросах по сравнению с пропускной стоимостью или справочниками? Это может помочь обеспечить более конкретный вопрос.

0
ответ дан 13 December 2019 в 22:08
поделиться