从 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 ++

visual studio 2010中调用另外一个项目中的方法

在 Visual Studio 6 中从 VB 调用 VS2010 C++ dll