2012-09-19 37 views
0

我是Linux,Windows和osX上C++庫的開發者。由於osX現在不能正確處理匿名異常,因此我考慮乾淨地標記需要導出的符號。在these explanations之後,我定義了兩個宏:FOO_APIFOO_LOCAL用於標記符號。現在我有以下問題:C++符號導出

我在自己的文件中定義每個類(因爲我不想要1000個以上的長文件)。如果類A僅用於我的庫中,則將其標記爲FOO_LOCAL是有意義的。但是,如果類B有一個A類型的私人成員,並且B類是FOO_API,那麼我收到編譯器警告,並且鏈接失敗(找不到符號)。這似乎違背了這些出口屬性的重點。那麼,它應該是什麼?我用類似class FOO_LOCAL A {...}的標記我的課是這樣嗎?

是否也沒有辦法讓所有私人會員在本地? (因爲他們是私人的,他們不應該被直接訪問),這將使標記過程更簡單...

最後,當我標記例如我的異常類,它編譯和運行正常,但顯示符號(nm -C -D my_lib.so)顯示,所有符號仍然存在......

+0

我不明白...類成員變量沒有聯動,除非他們是靜態的。如果是這樣的話? – rodrigo

+0

@rodrigo我想問題是,當包括API頭文件和創建API類的實例(可能需要在堆棧上分配成員)時,這些都是'看到'的。也許使用指針在API類中轉發聲明的本地類也可以解決問題。 –

+0

@ g-makulik:完全沒有意義。可視性是鏈接的一個屬性,所以如果沒有鏈接,可見性就沒有問題。除非A的構造函數是內聯的,當然... – rodrigo

回答

1

可以使用pimpl idiom隱藏從公共圖書館內部實現API類(從而在連接庫時)。

S.th.像:

B.hpp:

class BImpl; 

class FOO_API B 
{ 
public: 
    // Public stuff 
    B(); 
    ~B(); 

    void foo(); 
private: 
    BImpl* bimpl; 
}; 

B.cpp:

#include "B.hpp" 
#include "A.hpp" 

struct BImpl 
{ 
    void foo() 
    { 
     // Do something with 'a' 
    } 

    A a; 
}; 

B::B() 
: bimpl(new BImpl()) 
{ 
} 

B::~B() 
{ 
    delete bimpl; 
} 

void B::foo() 
{ 
    bimpl->foo(); 
} 
+0

我寧願避免使用這種構造,因爲代碼的某些部分對性能至關重要(並且爲了代碼清晰)。而且由於我的代碼是開源的,我不需要隱瞞任何來自競爭對手邪惡眼睛的東西...... – mathias