2009-08-05 35 views
6

正如我previousquestions的結果,我問自己:是不是有用在所有安裝了插件系統C++接口?以下幾點是講反對:我爲什麼要建立C++中的插件接口而不是C

  • 沒有共同ABI不同的編譯器和它們的版本之間,在內存中的對象
  • 沒有直接出口類沒有共同的佈局。你必須導出工廠和析構函數。問題出現,如果你的對象是由其他對象只delete它們,例如智能指針舉行。
  • 的STL的不同實現,如果你剋制自己的C++語言,你幾乎結束的其餘部分可以不通過std::list<T>到插件
  • 像升壓

不同版本使用的庫與「C子集」。有沒有說使用C++的觀點? Qt-Toolkit如何解決上述問題?

注:我指的主要是Linux系統。不過,我對其他平臺上的解決方案感興趣。

另一個問題:什麼是用C接口的問題?內存佈局struct s? C應該避免哪些語言部分?

+1

C標準也沒有指定ABI。事實上,你所抱怨的所有問題都可以適用於C,就像C++一樣。 – 2009-08-05 13:49:27

+0

是的,值得注意的是,標準一般由操作系統設置,可能與C編譯器的功能有關,也可能沒有關係。在Windows上,它是stdcall。 – 2009-08-05 14:03:40

+0

@Neil。 C標準具有明確的ABI。這就是爲什麼C是許多其他語言之間的GLUE的原因。 – 2009-08-05 17:00:19

回答

6

雖然這比「爲什麼」更關注「如何」,但您可能對(not yet)Boost.Extension庫以及author's blog關於這個話題。

對於「爲什麼」的一部分,我的2個(加拿大)分:這取決於觀衆(插件作家)和應用程序及其插件之間的接口豐富:

  • 如果觀衆是大型或異構的,C++插件系統的侷限性(保持插件端和應用端與編譯器和庫版本同步)變得不切實際,並且C接口更易於維護。如果觀衆很小,同質或者在你的控制之下,這些問題就不那麼重要。
  • 如果界面很豐富(手工揮舞着「豐富」的精確含義),C界面可能會變得繁瑣寫入,並且天平在C++端傾斜。

但是,第一個標準(觀衆)更重要,因此只有當觀衆是同質的並且界面顯着受益於表現性收益時,C++界面纔有意義。

+1

我有點贊同第一個項目符號。然而,在一個可執行文件的開發之外,觀衆很小,同質並且在你的控制之下足以應用這種情況的情況將非常罕見。 – 2009-08-05 14:02:07

+0

@ T.E.D .:通過「在單個可執行文件上進行開發」,你的意思是「可用於單個可執行文件的插件」或「單一,單一的可執行文件,根本沒有插件」? – 2009-08-05 14:50:09

+0

我主要想到後者,但前者可能會限定爲 – 2009-08-05 17:43:52

0

我認爲你是有回答你自己的問題。沒有什麼能阻止你實現一個簡單的C插件接口,並允許插件編寫者使用C++來實現他們的插件。只是嘗試從Netscape Plugin API所犯的錯誤中學習...

+1

我在哪裏可以找到關於「Netscape Plugin API造成的錯誤?」的一些信息? – phlipsy 2009-08-06 09:35:17

+0

關於「Netscape Plugin API所犯的錯誤」的任何鏈接? – augustin 2011-01-14 03:50:57

1

一般來說,將接口編寫到一些可以依靠的接口標準是一個聰明的想法。這就是爲什麼幾乎每個操作系統都提供這樣一個接口。在大多數Unix上,C編譯器使用與OS相同的約定,所以他們稱之爲C調用約定。 Windows已爲此目的進行調用。

如果您嘗試使用一些編譯器內部調用接口(如C++),那麼您將成爲您提到的所有問題的犧牲品。即使編譯器更新也很容易讓你失望。

4

我曾經用C++編寫過一個我開發的系統的插件接口,這是一個很大的錯誤。可行,但不實際。今天,我總是純粹用C語言編寫接口,並且儘可能簡單。這些選擇的好處非常重要。如果你的插件編寫者需要一個C++ API,你可以簡單地編寫一個調用C接口的C++包裝器。作爲一個額外的好處,如果你的插件作者想要一個API在任何其他語言,C API將永遠是更容易創建綁定。

+0

+1的C++包裝理念。 – phlipsy 2009-08-06 09:49:01

相關問題