Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于C++;C语言中的类访问/操作_C++_C_Class - Fatal编程技术网

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

C++ 关于C++;C语言中的类访问/操作,c++,c,class,C++,C,Class,我已经读了几个星期关于堆栈溢出的问题了。。。这将是我的第一个问题 所以我最近开始研究C访问/操纵C++类。我明白,理想情况下,在正常情况下,不应该单独编译C和C++中的组件,但目前这不是一个选项。 我查阅了3个关于C中可以使用C/C++的教程,它们是: 《C++与C互操作指南》 在同一程序中混合C和C++代码 “[32]如何混合使用C和C++” 首先,我已经知道: 您必须使用extern“C”来避免 C++函数名称的修改. 您需要C兼容的回调原型 < P> G+++必须编译C++到.0文件

我已经读了几个星期关于堆栈溢出的问题了。。。这将是我的第一个问题

所以我最近开始研究C访问/操纵C++类。我明白,理想情况下,在正常情况下,不应该单独编译C和C++中的组件,但目前这不是一个选项。 我查阅了3个关于C中可以使用C/C++的教程,它们是:

《C++与C互操作指南》

在同一程序中混合C和C++代码 “[32]如何混合使用C和C++”

首先,我已经知道:

  • 您必须使用extern“C”来避免 C++函数名称的修改.

  • 您需要C兼容的回调原型

  • < P> G+++必须编译C++到.0文件,GCC编译C特定代码到.O文件,然后链接后。

因此,我的项目由4个文件组成:

  • h,这个标题将列出C/C++将看到的所有原型(当然C不可见的类)
  • 包含foo类的foo.cpp,以及一组用于调用该类和方法的C兼容回调函数
  • c一组特定于c的包装器,引用foo.cpp中的回调函数
  • main.c试验方法
  • 这是我输入的代码,然后是我的问题:

    福安

    测试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个文件,就像我之前提到的。。。它编译得很好。但我不太明白

    为什么太阳和SavaSIFT文章建议创建C包装器,其唯一的代码是把它的参数传递到C/C++兼容的函数上,然后调用C++特定的代码? i、 e

    从我的test.c文件中可以看到。。。我可以毫无问题地调用任意一组调用(据我所知)。包装纸是不必要的开销,还是我完全忽略了它们的要点?我唯一的猜测与C/C++的指针寻址方案有关。。。但我不确定

    还有,我想除了这个还有更多的问题。。。但这三个网站是我能找到的唯一针对这个问题的网站。因此,如果我还有其他明显的疏忽,我会感谢他们的提及

    提前感谢您的帮助/建议,
    CX

    如果您有一系列不是面向对象的或位于命名空间中的函数,则无需再次包装它们。您的c_u系列函数是冗余的


    任何外部C++的C++函数都有全局(即,没有命名空间/静态成员)链接,只需要C-COMPAT数据类型(通常我们使用像您这样的不透明指针),那么它不需要被包装。这就是包装功能。C++直接使用成员函数,不需要使用它们,当然也不需要被欺骗。就像我想的那样。。。但是我还是有点困惑,因为Sun和Parashift的文章中有多余的函数。而且,您忘记了DeleteFoo函数。

    #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);
    
    }
    
    //in Stuff.cpp
    void CallCppStuff () { /* c++ stuff */ }
    
    //in wrapStuff.c
    wrapCppStuff() { CallCppStuff() }