Цель реализации vtable в C вместо C ++ - PullRequest
0 голосов
/ 09 ноября 2019

Я только начал погружаться в среду GStreamer и с удивлением обнаружил, что, несмотря на то, что он написан на чистом C, он использует объекты и полиморфизм. Затем я обнаружил, что можно эмулировать некоторые функции C ++, такие как наследование в C. Речь идет о реализации таблицы виртуальных функций самостоятельно. Я немного запутался в этой идее, зачем кому-то это нужно. Если бы мне пришлось выбирать между реализацией виртуальных таблиц в C и использованием C ++ для проекта, я бы определенно использовал проверенную и хорошо известную реализацию функций языка C ++. Вся идея кажется мне как изобретать колесо. Каковы преимущества использования макросов в C:

GST_IS_EVENT(obj)
GST_EVENT_CAST(obj)

по сравнению с C ++:

dynamic_cast<Derived*>(&baseObj);

Есть две вещи, о которых я могу думать:

  • C понимает относительно хорошо для большего количества людей, и легче поддерживать кодовую базу с большим количеством участников
  • C проще, и код будет легче поддерживать

Существуют ли какие-либо технические преимуществаC с реализацией vtable через C ++?

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Наиболее важной причиной является то, что библиотека C ABI также является стандартной библиотекой ABI, по крайней мере, в Linux, Windows и Mac. Другими словами, эти библиотеки можно использовать на любом языке (который поддерживает использование внешних библиотек).

C ++ - это отдельная история. Например, нет стандартного ABI для C ++ vtable. Кроме того, для поддержки перегрузок методов и функций, а также пространств имен C ++ выполняет сортировку имен для символов. Кроме того, исключения - это еще одна вещь, которая влияет на то, как вызываются функции, и для этого могут даже потребоваться определенные переключатели компилятора, даже если используется тот же компилятор.

Можно было бы просто написать «C» с помощью C ++ и экспортироватьтолько extern "C" символов, но если вы это сделаете, вы также можете использовать C, чтобы избежать сложности смешивания языков.

0 голосов
/ 09 ноября 2019

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

Может быть, их модель ООП отличается от модели C ++.

...