关于C中的C++类访问/操作

Cod*_*CDM 4 c c++ class

我已经在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*/
Run Code Online (Sandbox Code Playgroud)

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);

}
Run Code Online (Sandbox Code Playgroud)

所以我将定义分成4个文件,正如我之前提到的......它编译得很好.但这是我不太了解的.

为什么sun和parashift文章建议创建C-Wrappers,其唯一的代码是将它的参数传递给C/C++兼容函数,然后调用C++特定代码?

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

//in wrapStuff.c
wrapCppStuff() { CallCppStuff() }
Run Code Online (Sandbox Code Playgroud)

正如你从我的test.c文件中看到的那样......我能够在没有问题的情况下调用任何一组调用(据我所知).c_包装器是不必要的开销,还是我完全错过了它们的全部内容?我的唯一猜测是与C/C++的指针寻址方案有关......但我不确定.

此外,我想还有更多的问题,除此之外...但这三个网站都是我能找到的特定问题.因此,如果我有任何其他明显的疏忽,我会很感激他们的提及.

提前感谢任何帮助/建议,CX

Pup*_*ppy 6

如果您有一系列非面向对象的函数或在命名空间中,则无需再次包装它们.您的c_系列函数是多余的.

任何外部C的C++函数都具有全局(即非命名空间/静态成员)链接,并且只采用C-compat数据类型(通常我们使用像你一样的不透明指针),然后它不需要被包装.那是包装功能.C++直接使用成员函数,不需要使用它们,并且它们当然不需要被欺骗.