2010-01-16 149 views
5

是否有什麼祕訣可以給我說說傳遞指針結構,雙打,功能,...從C程序的C++庫,回來了?傳遞指針到C++,反之亦然

+3

這是一般一個很好的問題,但是,讓您擁有更具體的問題會幫助社區爲例使用情況下提供最好的建議。 – 2010-01-16 04:41:54

回答

10

假設你在兩個不同的庫靜態或動態(DLL文件在Linux和其他* nix的變種窗口共享庫)我最關心的問題,這些編碼如下:

  1. 它們使用相同的編譯器進行編譯。雖然如果所有C++導出都使用C樣式命名約定導出,則這不是必需的,但C++到C++調用兩個C++模塊之間的類實例是必需的。這是必要的,因爲不同的編譯器如何以不同的方式修改C++導出。

  2. 不要將C++類轉換爲C結構體。即使字段的佈局相同,它們在封面下也不盡相同。如果C++類有任何虛擬成員,則它們具有「v-表」;這個v表允許正確調用繼承或基類方法。

  3. 這是C 1至C或C++來C++以及爲C的真實的C++。確保兩個輸出庫使用相同的字節對齊方式。您只能通過閱讀您的編譯器或開發環境文檔來確定這一點。

  4. 請勿將malloc/free與new/delete混合使用。更具體地說,不要使用「free」分配帶有新的可用內存的內存,反之亦然。許多編譯器和操作系統在兩者之間處理內存管理的方式不同。

  5. 傳遞函數指針:只要它們暴露到/從C++作爲「」外部的「C」「」這應該是很好。 (您需要引用編譯器文檔,瞭解如何確定將頭文件編譯爲C或C++以將其保存在一個文件中,還是需要在每個項目中使用相同函數聲明的兩個獨立副本 - I建議第一)

  6. 傳遞雙打:這是一個內置在C和C++型和應處理是相同的。

  7. 如果您必須與C函數共享C++對象的實例並在C代碼中對其進行操作,請公開一組C++導出的助手函數,這些函數會調用C++對象上適當的方法。純C代碼無法在C++對象上正確調用方法。

 

    Pseudocode-ish Example: 
    // C++ class 
    class foo { 
     public: 
      void DoIt(); 
    }; 

    // export helper declarations 
    extern "C" void call_doit(foo* pFoo); 
    extern "C" foo* allocate_foo(); 
    extern "C" deallocate_foo(foo* pFoo); 


    // implementation 
    void call_doit(foo* pFoo) 
    { 
     pFoo->DoIt(); 
    } 

    foo* allocate_foo() 
    { 
     return new foo(); 
    } 

    deallocate_foo(foo* pFoo) 
    { 
     delete pFoo; 
    } 

    // c consumer 
    void main() 
    { 
     foo* pFoo= allocate_foo(); 
     call_doit(pFoo); 
     dealocate_foo(pFoo); 
    } 

 
+0

可能值得閱讀本文: http:///stackoverflow.com/questions/2045774/developing-c-wrapper-api-for-object-oriented-c-code – 2010-01-16 05:54:15

0

C和C++指針是相同的 - 一個指針基本上指向的內存塊,並且不改變從C/C++去。

你要小心約穿越不是堆的類型 - 例如,不要在一個庫分配和可能有另一個堆或使用其他運行時版本庫中取消分配(反之亦然) 。

您是不是要問關於傳遞值或傳遞引用的問題?這可能有助於提供更具體的問題。

+0

指向函數的指針如何? – adk 2010-01-16 04:46:38

+0

指向函數的指針(不是方法)在C++中與C中相同。但是,您必須用'extern「C」'將它們定義爲不會使它們受到損壞 – psychotik 2010-01-16 04:49:11

0
  • 不要忘了爲extern 「C」關鍵字 避免問題與C++重整 名。
  • 不要使用通過引用傳遞的參數類型,但指針