Код C++ и объекты от C?

Вы можете использовать профилировщик Dev Tools.

console.time('Timer name');
//do critical time stuff
console.timeEnd('Timer name');

«Имя таймера» должно быть одинаковым. Вы можете использовать несколько экземпляров таймера с разными именами.

7
задан Anton Kazennikov 29 June 2009 в 17:05
поделиться

5 ответов

Это, в общем, самый простой метод.

Помните также, что вам нужно будет использовать extern "C" также для всех ваших "оболочек" методов C.

8
ответ дан 6 December 2019 в 10:52
поделиться

Вы почти у цели. Приставьте к автономным функциям префикс extern «C» , чтобы отключить изменение имени компилятора C ++ .

Например:

extern "C" void *make_foo(...){
  Foo *ptr = new Foo(..)

  return static_cast<void *>(ptr);
}
7
ответ дан 6 December 2019 в 10:52
поделиться

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

1
ответ дан 6 December 2019 в 10:52
поделиться

Вы можете использовать Verrazano / Fetter для создания привязок CFFI для кода C ++. Но для этого требуется GCC-XML, и я не уверен в его переносимости.

1
ответ дан 6 December 2019 в 10:52
поделиться

Если возможно, пусть ваши классы будут производными от структуры. Затем вы можете использовать указатели на эту структуру в коде C:

// C++ code
extern "C" struct Cfoo {};
extern "C" struct Cbar {};

class foo : public Cfoo {};
class bar : public Cbar {};

// C API
extern "C" {
    struct Cfoo;
    struct Cbar;
}

Это не совсем ошибка, однако gcc, по крайней мере, предупреждает о преобразовании между указателями с разными типами.

void foo (void) {
    struct Cfoo * pf;
    struct Cbar * pb;
    pf = pb;        // gcc warns
}

Если вы не можете наследовать, используйте аналогичную идею, но у вас есть структура C хранит указатель на объект C ++ и снова просто объявляет структуры в C API:

// C++ code
class foo {};
class bar {};

extern "C" struct Cfoo { foo * pFoo; };
extern "C" struct Cbar { bar * pBar; };

// C API
extern "C" {
    struct Cfoo;
    struct Cbar;
}

Недостатком здесь является то, что необходимо позаботиться о времени жизни объектов Cfoo и Cbar.

1
ответ дан 6 December 2019 в 10:52
поделиться