2010-07-06 65 views
4

我一直在Stack Overflow上閱讀幾個星期的問題......這將是我的第一個問題。關於C++類訪問/操作C

所以最近我研究過讓C訪問/操作一個C++類。我理解理想情況下,在正常情況下,不應該分別使用C和C++編譯組件,但目前這不是一種選擇。

我看着就能夠端口3個教程/ C中使用C++,它們是:

DevX

「指南C++和C的互操作性」,「混合使用C和C++代碼中

:[32]如何在 Parashift

首先,我已經知道混合C和C++ 「相同的程序」上Sun's site.

文章」 0

  • 您必須使用extern「C」來避免 C++函數名稱損壞。

  • 您需要兼容C的回調原型。

  • G ++必須將C++編譯爲.o文件,GCC將C特定代碼編譯爲.o文件,然後將兩者鏈接起來。

其結果是,該項目我是由4個文件:

  1. foo.h中,標頭會列出所有原型,C/C++會看到(類隱形下向C當然)
  2. foo.cpp包含Foo類,和一組C調用的回調函數來調用類和方法。
  3. fooWrap.c一組引用foo.cpp中的回調函數的特定於C的包裝器。
  4. main.c測試方法。

這裏我輸入了代碼,那麼我的問題:

foo.h中

// Header File foo.h 
#ifndef FOO_H 
#define FOO_H 

//Content set inside this #ifdef will be unseen by C compilers 
    #ifdef __cplusplus 
     class Foo 
     { 
     public: 
      void setBar(int); 
      void printBar(); 
     private: 
      int bar; 
     }; 
    #endif 
//end of C++-only visible components. 

    #ifdef __cplusplus 
    extern "C" { 
    #endif 

    //Stuff made to be seen by C compilers only. fooWrap.c has definitions. 
    #if defined(__STDC__) && !defined(__cplusplus) 
     typedef struct Foo Foo; 

     //C-wrappers for C++ callback functions. 
     Foo * c_NewFoo(); 
     void c_SetFooBar(Foo *, int); 
     void c_PrintFooBar(Foo *);  
    #endif 

    //These are the functions C++ AND C can both use... 
    Foo * newFoo();    //allocates the memory for Foo class, pass address back. 
    void setFooBar(Foo * , int); //set internal contents of Foo object. 
    void printFooBar (Foo *); //print internal contents of Foo object. 

    #ifdef __cplusplus 
    } 
    #endif 

#endif /*FOO_H*/ 

TEST.C

#include "foo.h" 

// test.c test file for wrappers that manipulate C++ objects. 

main() 
{ 

//looks very C++ like... this makes C-Programmers cringe doesn't it? 
Foo * cfoo = c_NewFoo(); 
Foo * cppfoo = newFoo(); 

//using the C-specific wrappers. 
c_SetFooBar(cfoo,31415); 
c_PrintFooBar(cfoo); 

//using the C/C++ callback functions to Foo objects. 
setFooBar(cppfoo,9001); 
printFooBar(cppfoo); 

} 

所以我分裂定義成4正如我前面提到的那樣...並且它編譯得很好。但這是我沒有得到的。

爲什麼sun和parashift文章建議創建C-Wrappers,它的唯一代碼是將參數傳遞到C/C++兼容函數,然後調用C++特定代碼?

//in Stuff.cpp 
void CallCppStuff() { /* c++ stuff */ } 

//in wrapStuff.c 
wrapCppStuff() { CallCppStuff() } 

正如你可以從我的test1.c文件看...我可以調用任何設置沒有問題的呼叫(只要我可以告訴)。c_ wrappers是不必要的開銷,還是我完全忽略了它們的全部意義?我唯一的猜測與C/C++的指針尋址方案有關......但我不確定。

此外,我想除此之外還有更多的問題......但這3個網站都是我能找到的具體問題。所以如果我還有其他明顯的疏忽,我會很感激他們提到的。

預先感謝任何幫助/建議, CX

回答

6

如果你有一系列不反對爲導向或名稱空間中的功能,就沒有必要再包裝他們。您的c_系列功能是多餘的。任何C++函數都是extern C,具有全局(即不是名稱空間/靜態成員)鏈接,並且只採用C-compat數據類型(通常我們使用的是不透明的指針),那麼它不需要被包裹。這是包裝功能。 C++直接使用成員函數,並不需要使用它們,它們當然也不需要被欺騙。

+0

謝謝。正如我想的那樣......但是當太陽和Parashift文章做出冗餘功能時,我又有點困惑。 – CodeXCDM 2010-07-06 14:03:09

+1

另外,您忘記了DeleteFoo功能。 – Puppy 2010-07-06 15:56:09