Я программист C ++ для начинающих, но я достаточно хорошо понимаю концепции языка. Когда я начал изучать внешние библиотеки C ++, такие как SDL, OpenGL (возможно, и кое-что еще), к моему большому удивлению, я обнаружил, что они вообще не используют концепции C ++.
Например, ни SDL, ни OpenGL не используют классы или исключения, предпочитая функции и коды ошибок. В OpenGL я видел такие функции, как glVertex2f, который принимает 2 переменные с плавающей точкой в качестве входных данных и, вероятно, будет лучше в качестве шаблона. Более того, эти библиотеки иногда используют marcos, хотя существует общее мнение, что использование макросов - это плохо.
В целом, они, кажется, написаны больше в стиле C, чем в стиле C ++. Но ведь это совершенно разные несопоставимые языки?
Вопрос в том, почему современные библиотеки не используют преимущества языка, на котором они написаны?
Ответы:
И OpenGL, и SDL являются библиотеками C и предоставляют интерфейс C для остального мира (поскольку практически каждый язык может взаимодействовать с C, но не обязательно с C ++). Таким образом, они ограничены процедурным интерфейсом, который дает вам C, и способом C объявлять и использовать структуры данных.
Помимо аспекта «взаимодействия с другими языками», который предлагает вам интерфейс C, C в целом имеет тенденцию быть немного более переносимым, чем C ++, что, в свою очередь, облегчает получение не платформо-зависимой части кода библиотек. как они работают на другой ОС или аппаратной архитектуре. Практически на каждой платформе есть достойный компилятор C, но есть и такие, в которых есть ограниченные компиляторы C ++ или которые не очень хороши.
Хотя C и C ++ являются очень разными языками, они не являются «несовместимыми», на самом деле, в значительной степени C ++ является надмножеством C. Существует несколько несовместимостей, но их немного, поэтому использование интерфейса C из C ++ очень просто сделать.
источник
float3
s, потому что все, что касается оборудования, это массивы с плавающей точкой. Структура «класс» (представление о том, что вектор равен 2, 3 или 4 числам с плавающей запятой) неявно связана с тем, как карта получает доступ к своей памяти. Возможно, было бы неплохо подумать на уроках при программировании графики, но, на мой взгляд, такая работа достаточно близка к аппаратному обеспечению, так что это скорее хлопот, чем помощь для отвлечения грязных деталей реализации.Я думаю, что вы путаете «написание библиотеки» с «разоблачением API извне». Я не особо разбираюсь в библиотеках, о которых вы упомянули (они могут быть написаны для внутреннего использования в C), но я знаю, что многие другие, включая меня, написали библиотеки / фреймворки C ++, в которых в полной мере использовались все виды причудливых практик / шаблонов ООП. , но все же выставил API в стиле C для внешнего мира.
В прошлом, в качестве эксперимента в одном из проектов на работе, я решил выставить «OO» интерфейс из C ++ DLL. Чтобы скрыть внутренние детали и избежать множества других вещей, я чуть не перестроил Windows COM (компонентную объектную модель). После этого проекта я понял, что COM не так плох, как это делают люди, потому что а) он предоставляет интерфейсы ООП, б) заботится обо всех проблемах, с которыми я столкнулся, и в) является достаточно стандартным, чтобы его можно было использовать из ряда Другие языки.
Но COM все еще не без своего багажа. Во многих случаях обычный API плана в стиле C все еще является гораздо лучшей альтернативой.
источник
OpenGL и SDL являются библиотеками C, а не библиотеками C ++. Вы можете использовать их из C ++, но они написаны на C и имеют C API (который также доступен из других языков; доступ к C ++ - через FFI). Взгляните на Boost для большого массива универсальных (и некоторых специализированных) библиотек C ++ и SFML для мультимедийной библиотеки C ++.
источник
Говоря конкретно об OpenGL, OpenGL изначально был частью стека API - OpenGL предоставлял низкоуровневый, ориентированный на производительность API, доступный из C (или даже Fortran), в то время как OpenInventor предоставляет высокоуровневый объектно-ориентированный API, разработанный для использования с C ++, предоставляя как высокоуровневый API графов сцен, так и абстракции для сохранения / чтения сцен в / из файлов, а также интеграцию с GUI.
В итоге OpenGL пошел намного дальше, чем OpenInventor (он удовлетворял более насущную потребность, предоставляя производителям видеооборудования что-то для оптимизации и предоставляя общий низкоуровневый API, на который люди могли бы ориентироваться, вместо того чтобы напрямую работать с аппаратным ускорением 3D). Но OpenInventor все еще существует, и есть хорошая реализация с открытым исходным кодом - Coin3D - с поддержкой Unix / X11, Windows и MacOS X / Cocoa.
источник
Эти библиотеки совсем не современны. Это API-интерфейсы C, причем плохие. Ваша предпосылка ошибочна.
источник