2008-10-21 11 views
0

正如標題所示,從C++類中導入/導出靜態數據是正確還是有效的?導出數據成員是否正確? (C++)

我發現我的問題 - 我正在看的類的作者試圖導出此平臺上不支持的可寫靜態數據。

但非常感謝您的迴應。

+0

你是什麼意思「出口數據成員」?讓他們公開? – Dima 2008-10-21 15:03:28

回答

1

它是否正確,因爲它會起作用並做你期望的事情?假設你正在討論在類或類成員上使用_declspec(dllexport/dllimport),是的,你可以這樣做,它應該給你預期的結果 - 靜態數據可以在你的dll之外訪問,其他C++代碼可以訪問它規定C++訪問規範(public/protected/private)不會首先阻止外部訪問。

這是一個好主意嗎?就我個人而言,我不這麼認爲,因爲您不僅會在圖書館內向外部世界揭露課程內部,這意味着在一天結束時改變實施細節幾乎是不可能的。問問你自己,如果你是100%確定,如果這個類的接口和它的大部分實現將永遠不會改變...

2

導出的C++類意味着DLL客戶端必須使用與DLL相同的編譯器由於名稱改變和其他問題。這實際上是一個相當大的問題,我曾經不得不將C封裝器編寫到一堆C++類中,因爲客戶端程序已經切換到MSVC9,而DLL本身使用MSVC71。 [將DLL切換到MSVC90還有其他一些問題]。從那以後,我一直對這個導出類的業務持懷疑態度,並且更喜歡爲所有東西寫一個C封裝器。

現在,如果您願意支付出口類的價格,我會說導出靜態數據不會使問題變得更糟。可以說,在你可以導出的東西中,導出靜態常量是最安全的。即便如此,我寧願不這樣做,因爲像Timo說的,你現在被鎖定在這個實現中。

我工作的框架之一要求其客戶端提供一組錯誤代碼常量。隨着時間的推移,我們發現使用簡單的一堆常量太脆弱了,我們轉而採用OO設計。我們有一個默認的實現,它將返回常見的錯誤代碼,但是每個錯誤代碼都是使用虛擬函數訪問的,而虛擬函數可以被各個客戶端覆蓋 - 而且他們通過某些高級設備特定的錯誤處理來使用它。此解決方案證明了遠遠比基於導出常數的可擴展性更高的

我建議您在輸出靜態變量之前認真考慮組件的演變情況。

0

類的(非靜態)數據成員上的dllexport(或導入)不執行任何操作。導出的「事物」是功能或全局數據(儘管這是一個值得懷疑的設計選擇)。類上的dllexport只是一個說「導出所有這些函數」的快捷方式。