2009-08-06 57 views
2

我有一個解決方案來建立一個在其項目屬性中啓用運行時類型信息的DLL。這是Visual studio 2005中的默認(/ GR)。在我們的庫中,我們有很少的dynamic_casts,所以我目前無法在沒有運行時類型信息的情況下構建DLL。允許在rtti禁用的應用程序中鏈接rtti啓用的DLL嗎?

現在我的客戶正在使用DassaultSystèmes的開發工具,該工具聲明他們不能使用運行時類型信息。它被禁用(/ GR-)總是。

問題是這是否是一個問題?

我試圖用一個小例子來說明這種情況,在這個小例子中,一個動態轉換的代碼創建了一個DLL。該DLL使用RTTI 啓用。一個小應用程序使用DL​​L,尤其是使用dynamic_casts的代碼。此應用程序內置RTTI 已禁用。它工作正常。但隨着不可預知的行爲任何事情都有可能發生......

我想告訴我的客戶,與他們中的一些使用RTTI和其他人不使用RTTI混合的DLL是沒有問題的,但我找不到任何關於它的詳細信息(使用Google,MSDN等)。有誰知道這個問題的答案嗎?

回答

3

是的,你可以,但有很大的限制。他們中的一些:

  • 不傳遞任何異常出來的DLL,
  • 沒有對非RTTI代碼中使用的dynamic_cast,
  • 您可以通過從DLL比較類數組的大小獲得奇效!的sizeof(DllClass [10])=的sizeof(DllClass)* 10
  • ...

使用RTTI的最明亮的例子啓用DLL非RTTI環境 - 是進程內OLE服務器。您可以使用嵌入到任何應用程序中的任何選項來開發DLL。

0

恕我直言,不應該有問題,只要你不調用dynamic_cast。 雖然Rtti是一個非常簡單的機制,但它不應該傷害混合設置。 這可能會傷害開發人員忘記它並寫入失敗的代碼。

大部分時間都不是dynamic_cast指向設計問題。