从 C (Visual Studio) 调用 C++ 类成员函数
Posted
技术标签:
【中文标题】从 C (Visual Studio) 调用 C++ 类成员函数【英文标题】:Call C++ class member function from C (Visual Studio) 【发布时间】:2009-09-25 22:55:03 【问题描述】:我需要从 C 程序调用 C++ 成员函数。 我在 C 代码中创建了 .cpp/.h 包装文件,包装了 C++ 成员函数。
即-wrapper.cpp
#include "wrapper.h"
extern "C"
void wrap_member1()
Class::member1();
void wrap_member2()
Class::member2();
和 wrapper.h:
#include <windows.h>
#include <stdio.h>
#include "../C++ class with members I need to call.h"
extern "C" void wrap_member1();
extern "C" void wrap_member2();
我的问题是当我遵守时: 错误 C2061:语法错误:标识符“类”
它指向 C++ 类的 .h 声明作为错误。结果与我没有包装文件一样......?
附:我还从原型中删除了“extern "C"”,并在包装函数上收到了错误:
error C2732: linkage specification contradicts earlier specification for 'wrap_member1'
有什么建议吗?
【问题讨论】:
另外:有哪些成员函数?静态还是非静态?看起来你想调用静态成员函数。 【参考方案1】:有两个问题:
第一,您将 C++ 头文件包含在 C 头文件中。这意味着 C 编译器获取 C++ 代码。这就是导致您遇到的错误的原因。正如Reed Copsey 建议的那样,将#include
放在C++ 源文件而不是C 头文件中。
二,你在 C 头文件中使用了extern "C"
。将您的声明包装在 #ifdef
中,如下所示:
#ifdef __cplusplus
extern "C"
#endif
/* Functions to export to C namespace */
#ifdef __cplusplus
#endif
这将使该文件可用于 C 和 C++。
【讨论】:
【参考方案2】:在您的包装器中,您必须有条件地编译 extern "C"
部分,因为它是一个仅限 C++ 的构造:
包装器.h:
#ifdef __cplusplus
extern "C"
#endif
extern void wrap_member1();
#ifdef __cplusplus
#endif
在 wrapper.cpp 中:
extern "C" void wrap_member1()
Class::Member1();
在您的 C 模块中,您仅包含 wrapper.h 和指向 wrapper.obj 的链接。
顺便说一句,Objective-C 能够使用 C++,只需在 XCode 中将文件名从 *.m 更改为 *.mm。
【讨论】:
Obj-C 跟什么有什么关系? 原帖有一个Objective-C标签【参考方案3】:你需要在 wrapper.cpp 中包含你的类:
#include "wrapper.h"
#include "ClassHeaderFile.h" // The header that defines "Class"
extern "C"
void wrap_member1()
Class::member1();
void wrap_member2()
Class::member2();
【讨论】:
似乎没有任何改变。另外,如果它包含在 wrapper.cpp 中包含的 wrapper.h 中,为什么我需要在此处包含它?只是好奇... 您应该从 wrapper.h 中删除它,并将其添加到 wrapper.cpp。请记住,如果您希望 wrapper.h 可以从 C 中使用,则它不应包含 C++ 代码 - 而class
显然是 C++ 代码。以上是关于从 C (Visual Studio) 调用 C++ 类成员函数的主要内容,如果未能解决你的问题,请参考以下文章
在Visual Studio C#中开发WebService,并从单独的VS解决方案中调用它
visual studio C/C++ 编程学习 visual studio 中的生成事件
C#代码不能在visual studio中运行完整的python脚本
Visual Studio Force Library导入C ++