簡體   English   中英

關於C中的C ++類訪問/操作

[英]Regarding C++ class access/manipulation in C

我已經在Stack Overflow上閱讀了幾個星期的問題......這將是我的第一個問題。

所以最近我研究了C訪問/操作C ++類。 我理解理想情況下,在正常情況下,不應該單獨用C和C ++編譯組件,但目前這不是一個選項。

我查看了有關能夠在C中移植/使用C ++的3個教程。它們是:

DevX上的 “C ++和C互操作性指南”

Sun網站 “在同一程序中混合使用C和C ++代碼”一文

“[32]如何在Parashift上混合使用C和C ++”

首先,我已經知道:

  • 您必須使用extern“C”來避免C ++函數名稱重整。

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

  • G ++必須將C ++編譯成.o文件,GCC將特定於C的代碼編譯成.o文件,然后將它們鏈接起來。

結果,我的項目由4個文件組成:

  1. foo.h,標題將列出C / C ++將看到的所有原型(當然C類不可見)
  2. 包含Foo類的foo.cpp,以及一組用於調用類和方法的C兼容回調函數。
  3. fooWrap.ca一組特定於C的包裝器,它引用foo.cpp中的回調函數。
  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() }

正如你從我的test.c文件中看到的那樣......我能夠在沒有問題的情況下調用任何一組調用(據我所知)。 c_包裝器是不必要的開銷,還是我完全錯過了它們的全部內容? 我的唯一猜測是與C / C ++的指針尋址方案有關......但我不確定。

此外,我想還有更多的問題,除此之外...但這三個網站都是我能找到的特定問題。 因此,如果我有任何其他明顯的疏忽,我會很感激他們的提及。

提前感謝任何幫助/建議,CX

如果您有一系列非面向對象的函數或在命名空間中,則無需再次包裝它們。 您的c_系列函數是多余的。

任何外部C的C ++函數都具有全局(即非命名空間/靜態成員)鏈接,並且只采用C-compat數據類型(通常我們使用像你一樣的不透明指針),然后它不需要被包裝。 那是包裝功能。 C ++直接使用成員函數,不需要使用它們,它們當然不需要被欺騙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM