2009-08-05 8 views
6

W wyniku mojej previousquestions zadałem sobie pytanie: Czy w ogóle jest użyteczne skonfigurowanie interfejsu C++ dla systemu wtyczek? Poniższe punkty są mówiąc przeciwko niemu:Dlaczego powinienem ustawić interfejs wtyczki w C++ zamiast c

  • Brak wspólnego ABI pomiędzy różnymi kompilatory i ich wersjach, nie wspólny układ obiektów w pamięci
  • Brak bezpośredniego eksportu klasy. Musisz eksportować fabryki i destruktory. Pojawiają się problemy, jeśli obiekty są trzymane przez inne obiekty, które tylko są nimi, na przykład inteligentne wskaźniki.
  • Różne implementacje STL, nie można przekazać std::list<T> do wtyczki
  • różnych wersjach używanych bibliotek takich jak Boost,

Jeśli powstrzymać się do pozostałych części C++ języku prawie koniec z "podzbiorem C". Czy są jakieś punkty mówiące o używaniu C++? W jaki sposób Qt-Toolkit rozwiązuje wymienione problemy?

Uwaga: mam na myśli głównie system Linux. Mimo to interesuję się rozwiązaniami na innych platformach.

Dodatkowe pytanie: Jakie problemy występują przy użyciu interfejsu C? Układ pamięci struct s? Które części językowe C należy unikać?

+1

Standard C również nie określa ABI. W rzeczywistości wszystkie problemy, na które się skarżysz, mogą dotyczyć C tak samo, jak C++. –

+0

Tak, warto zauważyć, że standard jest ogólnie ustalany przez system operacyjny i może, ale nie musi mieć nic wspólnego z tym, co robią jego kompilatory. W systemie Windows jest to stdcall. –

+0

@Neil. Standard C ma dobrze zdefiniowaną ABI. Właśnie dlatego C jest GLUE między tak wieloma innymi językami. –

Odpowiedz

6

Chociaż jest to więcej o „jak” niż „dlaczego”, może być zainteresowany w bibliotece (not yet)Boost.Extension, jak również author's blog na temat.

Dla „dlaczego” strony, moje 2 (kanadyjskie) centy: To zależy od publiczności (scenarzyści plugin) i na bogactwo interfejsu między aplikacją i jego wtyczek:

  • Jeśli widownia jest duża lub heterogeniczna, ograniczenia systemu wtyczek C++ (utrzymywanie strony wtyczki i strony aplikacji synchronizowane w odniesieniu do wersji kompilatora i biblioteki) stają się niepraktyczne, a interfejs C jest łatwiejszy w utrzymaniu. Jeśli publiczność jest mała, jednorodna lub pod twoją kontrolą, problemy te nie są tak znaczące.
  • Jeśli interfejs jest bogaty (wymachiwanie ręczne na dokładne znaczenie słowa "bogaty"), interfejs C może być kłopotliwy w pisaniu, a równowaga przechyla się po stronie C++.

Jednak pierwsze kryterium (publiczność) jest ważniejsze, a interfejs C++ ma sens tylko wtedy, gdy publiczność jest jednorodna, a interfejs w znacznym stopniu korzysta z przyrostu wyrazistości.

+1

Zgadzam się z pierwszym punktem. Jednak sytuacje, w których publiczność jest niewielka, jednorodna i pod Twoją kontrolą wystarczająco, aby można ją było zastosować, będą rzadkością poza opracowaniem na jednym pliku wykonywalnym. –

+0

@ T.E.D .: Czy przez "tworzenie na pojedynczym pliku wykonywalnym" rozumiesz "wtyczki działające z jednym plikiem wykonywalnym" lub "jeden, pojedynczy, monolityczny plik wykonywalny bez wtyczek"? –

+0

Głównie myślałem o tym drugim, ale ten pierwszy prawdopodobnie zakwalifikuje się jako –

0

Myślę, że odpowiadasz na swoje własne pytanie. Nic nie stoi na przeszkodzie, aby wdrożyć prosty interfejs wtyczki C i umożliwić pisarzom wtyczki implementację wtyczki w C++. Po prostu nie spróbować i nauczyć się od błędów popełnionych przez Netscape Plugin API ...

+1

Gdzie mogę znaleźć informacje na temat "błędów popełnionych przez interfejs API wtyczki Netscape?" – phlipsy

+0

jakikolwiek link o "błędach popełnionych przez API Netscape Plugin?" – augustin

1

Generalnie dobrym pomysłem jest napisanie interfejsu do standardu interfejsu, na którym można polegać. Dlatego prawie każdy system operacyjny zapewnia taki interfejs. W większości Uniksów kompilatory C używają tej samej konwencji, co system operacyjny, dlatego nazywają ją konwencją wywołania C. Windows ma stdcall do tego celu.

Jeśli spróbujesz użyć wewnętrznego interfejsu wywoływania kompilatora, takiego jak C++, padniesz ofiarą wszystkich wymienionych problemów. Nawet aktualizacje kompilatora mogą cię wciągnąć.

4

Kiedyś stworzyłem w C++ interfejs wtyczki dla opracowanego przeze mnie systemu i był to wielki błąd. Wykonalne, ale w ogóle niepraktyczne. Dzisiaj zawsze robiłem interfejs wyłącznie w C i tak proste, jak to tylko możliwe. Korzyści z tych wyborów są naprawdę znaczące. A jeśli twoi twórcy wtyczek chcą API C++, możesz po prostu napisać opakowanie C++, które wywołuje interfejs C.

Dodatkową korzyścią jest to, że jeśli twoi twórcy wtyczek będą chcieli mieć interfejs API w jakimkolwiek innym języku, API C zawsze będzie łatwiej tworzyć powiązania.

+0

+1 dla idei opakowania C++. – phlipsy

Powiązane problemy