gpt4 book ai didi

C++ 常见问题解答 32.8 "pass an object of a C++ class to/from a C function"问题

转载 作者:行者123 更新时间:2023-11-28 08:00:05 25 4
gpt4 key购买 nike

http://www.parashift.com/c%2B%2B-faq/cpp-objs-passed-to-c.html

答案分为两部分。我猜第一部分是直到代码结束。

对于第一部分,我看到作者对用 C 编写的函数或 C++ 函数调用的函数使用“C”链接指令(extern "C")(见下文),因此链接会好的。

extern void c_function(Fred*);  // c function 
extern Fred* cplusplus_callback_function(Fred*); // c++ function

这是有道理的。

然后 Fred* 从 main() 一直传递到 c_function() [我想这就是作者/常见问题解答所说的将 C++ 对象传递给 C 函数],然后传递到 cplusplus_callback_function() [对象传递回 C++来自 C 函数的域]。

那么第一个问题,我对上面的理解正确吗?所以 FAQ 的答案只是“传递对象的指针”?

第二个问题,代码迷路后作者解释了什么。他突然说比较指针是否相等,base和derived之间的指针转换等。他想说什么?那个指针在传递给 c_function 之后就失去了所有的魔力?如果它是一个指向派生类的基类指针,如果将它传递给 C++ 函数,我们可以比 C 函数做更多的事情?

最后一个问题,我想我不知道 C++ 代码是否包含在 extern "C"指令中,唯一改变的是链接,但没有别的? C++ 代码仍然是 C++,对吧?如果我用 C++ 编写所有代码,但故意将一些函数包装在 extern "C"中,我会失去什么?

最佳答案

So the answer to the faq is just "pass a pointer" of the object?

还有一件事,就是#ifndef __cplusplus,你需要

typedef struct Fred Fred;

即将 Fred 声明为 struct(注意 structclass 仅在默认访问权限方面不同)。

What is he trying to say? That pointer after being passed to c_function, lost all its magic?

C++ 编译器理解继承并会在进行比较之前转换指针类型。相比之下,C 编译器没有继承的概念,实际上不允许不同类型的指针指向单个对象,除非其中至少有一个是 void*char*无符号字符*。正如您在常见问题解答中看到的那样,面对桥接 C 和 C++,即使转换为 void* 也是微妙的。

简单的解决方案是只给程序的 C 端 Base 指针。即,如果可能的话,完全隐藏它的继承。

if i write all codes in C++, but deliberately wrap some functions in extern "C", what do i lose?

重载。不能有两个具有相同名称的 C 链接函数,即

extern "C" {
void foo(void);
void foo(int);
}

不可能。

关于C++ 常见问题解答 32.8 "pass an object of a C++ class to/from a C function"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11709434/

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