gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:40:37 24 4
gpt4 key购买 nike

几周来我一直在阅读有关 Stack Overflow 的问题...这将是我的第一个问题。

最近我研究了如何让 C 访问/操作 C++ 类。我知道在正常情况下,理想情况下不应分别用 C 和 C++ 编译组件,但目前这不是一种选择。

我查看了 3 个关于能够在 C 中移植/使用 C++ 的教程。它们是:

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

“在同一程序中混合 C 和 C++ 代码”一文 Sun's site.

[32] 如何混合使用 C 和 C++”,发表于 Parashift

首先,我已经知道的:

  • 你必须使用 extern "C"来避免C++ 函数名称修饰。

  • 您需要与 C 语言兼容的回调原型(prototype)。

  • G++ 必须将 C++ 编译成 .o 文件,GCC 将特定于 C 的代码编译成 .o 文件,然后链接两者。

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

  1. foo.h,头文件将列出 C/C++ 将看到的所有原型(prototype)(当然 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*/

测试.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++ 的指针寻址方案有关...但我不确定。

另外,我想除了这个问题之外还有更多问题......但是我能找到的所有这 3 个站点都是针对这个问题的。因此,如果我有任何其他明显的疏忽,我将不胜感激。

在此先感谢您的帮助/建议,客户体验

最佳答案

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

任何外部 C 的 C++ 函数,具有全局(即非 namespace /静态成员)链接,并且只采用 C 兼容数据类型(通常我们像您一样使用不透明指针),那么它不需要包裹。那就是包装功能。 C++直接使用成员函数,不需要使用它们,当然也不需要被欺骗。

关于c++ - 关于 C 中的 C++ 类访问/操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3185243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com