混合c和c ++的问题

时间:2010-02-15 09:48:51

标签: c++ c

我需要构建一个将函数导出到c项目的c ++项目 这是我的c ++类:

** MyCppClass.h **

class MyCppClass
{
public:
static void MyCppMethod()
}

** MyCppClass.cpp **

void MyCppClass::MyCppMethod(){}

*现在我需要为Method MyCppMethod(静态)创建一个接口。

我这样做了: ** MyExport.h **

#define Export __declspec(dllexport)
extern "C" void Export MyCppMethodWrapper();

** MtExport.cpp **

#include "MyCppClass.h"
#include "MyExport.h"

void MyCppMethodWrapper() { MyCppClass::MyCppMethod();}

就是这样!

现在是C部分(不同的项目) 我将项目与MyExport.lib链接 ** program.c **

#include "MyExport.h"        ->does not compile because of the extern "C"
int main()
{
  MyCppMethodWrapper();   

}

如果我不在program.c中添加行:#include "MyExport.h",程序编译并正常工作但我需要为导出提供一个标题(客户端需要标题),我想制作程序使用那个标题。我怎么解决???

感谢您的回答

4 个答案:

答案 0 :(得分:5)

如果你想这样做,你可以很容易地有条件地定义extern:

#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endif

然后:

EXTERN_C Export MyCppMethodWrapper();

答案 1 :(得分:1)

通常你会这样做,在C ++程序中调用C函数,这是extern "C"的优点。在这种情况下,它对你没有帮助。

您可以做的就是在dll中找到静态方法的名称,在C代码中编写一些extern ...语句,然后调用静态方法。

请注意,C ++程序中的名称被破坏,即目标文件/库中的名称包含有关方法所属的类及其参数类型的信息。在Linux世界中有一些工具可以解码名称,但我不知道MS Windows世界中有什么可用的东西,大概是什么。

我的一般建议是,如果你必须这样做的话,再考虑一下。

答案 2 :(得分:1)

简短的回答是:你可以使用C ++中的C语言,但不是相反!

如果你想使用C语言中的C ++,你需要使用pure-C函数创建一个瘦包装器(即只有extern "C" { ... }使用才能在C ++中编译(如此声明)显然,在C)中没有效用,并且从C函数中使用它们。这应该类似于:

#ifdef __cplusplus // defined at least by G++, I don't know for other compilers
extern "C" {
#endif

// ... function definitions here
#ifdef __cplusplus
}
#endif

答案 3 :(得分:0)

除了brainiac的答案,你需要在program.c中使用dllimport

/* declare function directly */
extern "C" void __declspec(dllimport) MyCppMethodWrapper();

int main()
{
  MyCppMethodWrapper();   

}

如果您想使用相同的标题,则需要使用brainiac的答案,并为#ifdef使用额外的__declspec(dllexport)

#ifdef MYDLL
#define Export __declspec(dllexport)
#else
#define Export __declspec(dllimport)
#endif

EXTERN_C void Export MyCppMethodWrapper();

然后将/ D MYDLL添加到dll项目的构建标志中。