Что безопасно для системы плагина C++?

2D-массив в основном представляет собой 1D-массив указателей, где каждый указатель указывает на 1D-массив, который будет содержать фактические данные.

Здесь N - строка, а M - столбец.

динамическое распределение

int** ary = new int*[N];
  for(int i = 0; i < N; i++)
      ary[i] = new int[M];

fill

for(int i = 0; i < N; i++)
    for(int j = 0; j < M; j++)
      ary[i][j] = i;

print

for(int i = 0; i < N; i++)
    for(int j = 0; j < M; j++)
      std::cout << ary[i][j] << "\n";

бесплатно

for(int i = 0; i < N; i++)
    delete [] ary[i];

или

delete [] ary;
47
задан ThinkingStiff 27 July 2012 в 07:53
поделиться

8 ответов

Журнал доктора Dobb имеет статью , Создающую Вашу Собственную Сменную Платформу: Часть 1 , которая является довольно хорошим чтением на предмете. Это - запуск ряда статей, который покрывает архитектуру, разработку и развертывание C/C++ межплатформенная сменная платформа.

25
ответ дан Jonathan Leffler 26 November 2019 в 19:53
поделиться

Вы могли бы также хотеть рассмотреть замену стандартного сменного интерфейса интерфейсом сценариев. Существует некоторая очень хорошая привязка для нескольких языков сценариев в C/C++, которые уже решили Вашу проблему. Это не могла бы быть плохая идея создать сверху их. Например, взгляните на Повышение. Python .

6
ответ дан Konrad Rudolph 26 November 2019 в 19:53
поделиться

Qt имеет очень хорошую систему для плагинов, которые я использовал в прошлом. Это использует систему метаобъекта QT для преодоления многих проблем, обычно находил при попытке разработать плагины C++.

Один пример то, как Q_DECLARE_INTERFACE работы, чтобы препятствовать тому, чтобы Вы использовали несовместимый плагин. Другой ключ сборки , чтобы удостовериться, что Вы загружаете корректный плагин для своей архитектуры, ОС, компилятора. Если Вы не используете сменную систему QT, это вещи, о которых необходимо будет волноваться и изобрести решения для самостоятельно. Это - не обязательно аэрокосмические исследования, и я не говорю, что Вы перестали бы работать в нем, но парни в Trolltech довольно умны и потратили некоторое время, думая об этом, и я использовал бы то, что они создали, чем перестройте колесо сам.

Другой пример - то, что RTTI обычно не работает через границы DLL, но при использовании QT, вещей как qobject_cast, которые полагаются на систему метаобъекта, действительно работает через границы DLL.

6
ответ дан user2567875 26 November 2019 в 19:53
поделиться

Я думаю, что Вы - безопасное создание сменной системы на основе:

  • Упаковка сменной функциональности в библиотеку (.dll, .so, и т.д.)
  • Требование, чтобы плагин представил ключевой экспорт языка C.
  • Требование, что сменная реализация (и возврат указатель/ссылка на) абстрактный интерфейс C++.

, Вероятно, самая успешная система плагина C++: старый добрый Adobe Photoshop . И если не, что, один из виртуальных форматов синтезатора, таких как VSTi и т.д.

3
ответ дан 26 November 2019 в 19:53
поделиться

Книга C++ Имперфекта Matthew Wilson имеет хорошую информацию об этом.

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

3
ответ дан Peter Stuifzand 26 November 2019 в 19:53
поделиться

ACE имеет кросс-платформенную сменную архитектуру.

Выезд:

  1. менеджер ACE DLL
  2. ACE DLL

я предложил бы проверить книгу
Руководство Программиста ACE

2
ответ дан Martin York 26 November 2019 в 19:53
поделиться

У меня есть свой собственный игровой механизм, который имеет систему плагина C++.

у меня есть некоторый код в заголовочных файлах, таким образом, он помещается в единицу компиляции плагина.

Большие функции, которые живут в основном механизме, вызваны через экспортируемую функцию C (плагин называет MyObject_somefunction (MyObject *obj), который в механизме просто называет obj-> somefunction ()). Если вызывание функции C ужасно для Вашего вкуса, затем с некоторым обманом заголовка, когда заголовок включен в плагин, имейте функцию членства #defined для вызывания функции C:

#if defined(IN_THE_PLUGIN)
void MyObject::somefunction() { MyObject_somefunction(this); }
#endif

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

В основном, приемы, которые я использовал с целью быть для поддержания общей независимости от платформы, просто составляют экспорт C и приемы заголовочного файла.

1
ответ дан Jim Buck 26 November 2019 в 19:53
поделиться

Firefox работает на XPCOM ( http://www.mozilla.org/projects/xpcom/ ). Он вдохновлен Microsoft COM, но является мультиплатформенным.

2
ответ дан 26 November 2019 в 19:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: