Jestem programistą C ++ na poziomie początkującym, ale rozumiem pojęcia języka dość dobrze. Kiedy zacząłem uczyć się zewnętrznych bibliotek C ++, takich jak SDL, OpenGL (może też coś innego), ku mojemu wielkiemu zaskoczeniu odkryłem, że w ogóle nie używają pojęć C ++.
Na przykład ani SDL, ani OpenGL nie używają klas ani wyjątków, preferując funkcje i kody błędów. W OpenGL widziałem takie funkcje jak glVertex2f, który przyjmuje 2 zmienne zmiennoprzecinkowe jako dane wejściowe i prawdopodobnie byłby lepszy jako szablon. Co więcej, biblioteki te czasami używają marcos, podczas gdy wydaje się, że powszechna zgoda, że używanie makr jest złe.
Podsumowując, wydają się być napisane bardziej w stylu C niż w stylu C ++. Ale to zupełnie inne nieporównywalne języki, prawda?
Pytanie brzmi: dlaczego współczesne biblioteki nie korzystają z zalet języka, w którym są napisane?
źródło
Odpowiedzi:
Zarówno OpenGL, jak i SDL są bibliotekami C i udostępniają interfejs C reszcie świata (ponieważ prawie każdy język na rynku może się komunikować z C, ale niekoniecznie z C ++). W związku z tym są ograniczone do interfejsu proceduralnego, który daje Ci C i sposobu C deklarowania i używania struktur danych.
Oprócz aspektu „interfejsu z innymi językami” oferowanego przez interfejs C, ogólnie C jest nieco bardziej przenośny niż C ++, co z kolei ułatwia uzyskanie niezależnej od platformy części kodu bibliotek takie jak te działające na innym systemie operacyjnym lub architekturze sprzętowej. Prawie każda platforma ma przyzwoity kompilator C, ale wciąż istnieją takie, które mają ograniczone kompilatory C ++ lub te, które nie są zbyt dobre.
Chociaż C i C ++ są bardzo różnymi językami, nie są „niekompatybilne”, w rzeczywistości w dużym stopniu C ++ jest nadzbiorem C. Jest kilka niezgodności, ale nie wiele, więc używanie interfejsu C z C ++ jest bardzo łatwe do zrobienia.
źródło
float3
s, ponieważ cały sprzęt dotyczy macierzy liczb zmiennoprzecinkowych. Struktura „klasy” (pojęcie, że wektor ma 2, 3 lub 4 zmiennoprzecinkowe) jest domyślna w sposobie, w jaki karta ma uzyskać dostęp do stosu pamięci. Przyjemnie jest próbować myśleć na zajęciach podczas programowania grafiki, ale moim zdaniem ten rodzaj pracy jest wystarczająco blisko sprzętu, że jest bardziej kłopotliwy niż pomoc w usuwaniu brudnych szczegółów implementacji.Myślę, że mylisz „pisanie biblioteki” z „eksponowaniem API na zewnątrz”. Nie wiem zbyt wiele o bibliotekach, o których wspomniałeś (mogą być wewnętrznie napisane w C), ale wiem, że wiele innych, łącznie ze mną, napisało biblioteki / frameworki C ++, które w pełni wykorzystywały wszelkiego rodzaju fantazyjne praktyki / wzorce OOP , ale nadal udostępnia interfejs API w stylu C światu zewnętrznemu.
W przeszłości, jako eksperyment w jednym z działających projektów, postanowiłem udostępnić interfejs „OO” z biblioteki DLL C ++. Aby ukryć wewnętrzne szczegóły i uniknąć wielu innych rzeczy, prawie skończyłem na nowo opracowywać system Windows COM (model obiektowy). Po tym projekcie zdałem sobie sprawę, że COM nie jest tak zły, jak się wydaje, ponieważ a) ujawnia interfejsy OOP, b) zajmuje się wszystkimi problemami, na które natknąłem się, c) jest wystarczająco standardowy, aby można go było wykorzystać z wielu inne języki.
Ale COM wciąż nie jest pozbawiony bagażu. W wielu przypadkach zwykły, planowy interfejs API w stylu C jest nadal znacznie lepszą alternatywą.
źródło
Zarówno OpenGL, jak i SDL są bibliotekami C, a nie bibliotekami C ++. Możesz używać ich z C ++, ale są napisane w C i mają C API (który jest również dostępny z innych języków; C ++ jest trudny w dostępie przez FFI). Spójrz na Boost dla szerokiej gamy uniwersalnych (i niektórych specjalistycznych) bibliotek C ++ i SFML dla biblioteki multimedialnej C ++.
źródło
Mówiąc konkretnie do OpenGL, OpenGL był pierwotnie częścią stosu API - OpenGL dostarczył API zorientowane na wydajność niskiego poziomu, dostępne z C (lub nawet Fortran), podczas gdy OpenInventor zapewnia obiektowe API wysokiego poziomu, zaprojektowane do użycia z C ++, zapewniając zarówno interfejs API wysokiego poziomu wykresów, jak i abstrakcje do zapisywania / czytania scen do / z plików oraz integrację GUI.
OpenGL skończył znacznie dalej niż OpenInventor (zaspokoił bardziej palącą potrzebę, dając twórcom sprzętu wideo coś do zoptymalizowania i zapewniając wspólny interfejs API niskiego poziomu, na który ludzie mogliby celować zamiast bezpośrednio zajmować się sprzętem przyspieszającym 3D). Ale OpenInventor nadal istnieje i istnieje dobra implementacja open source - Coin3D - z obsługą Unix / X11, Windows i MacOS X / Cocoa.
źródło
Te biblioteki wcale nie są wcale nowoczesne. Są to interfejsy API typu C i złe. Twoja przesłanka jest wadliwa.
źródło