在C和C ++库之间共享变量的困境

时间:2011-05-03 08:57:30

标签: c++ c visual-studio-2010 dll

我有一个简单的问题。 我有两个库,一个用C编译,另一个用C ++编译,其中C库由C ++库链接和加载。我需要在C库中声明一个可以读写的结构实例。 你是如何做到这一点的?

由于

编辑:补充说它是一个结构的实例,而不仅仅是声明

4 个答案:

答案 0 :(得分:8)

您需要创建单个头文件,该文件包含在C和C ++库中的模块中:

#ifndef YOURSTRUCT_H
#define YOURSTRUCT_H

#ifdef __cplusplus
extern "C" {
#endif
    struct YourStruct
    {
        // your contents here
    };
#ifdef __cplusplus
}
#endif
// UPDATE: declare an instance here:
extern YourStruct yourInstance;
#endif

这种形式的头文件意味着两个编译器都会很高兴读取头文件,并且两者都会产生同名的文件。

<强>更新
然后你需要一个模块文件。只是一个。要么是C文件要包含在C库中,要么是C ++文件(如果它要包含在c ++库中):

#include "yourstruct.h"

YourStruct yourInstance;

现在全局实例的任何客户端,无论是C客户端还是C ++客户端,都必须#include "yourstruct.h"并引用yourInstance

<强>更新
正如Matthieu指出的那样,你最好将指针传递给周围的实例。例如。

#include "yourstruct.h"

#ifdef __cplusplus
extern "C" {
#endif

void yourFunction(YourStruct* someInstance);

#ifdef __cplusplus
}
#endif

答案 1 :(得分:2)

使用extern C链接规范。

#ifdef __cplusplus 
extern "C" {
#endif 

    struct YourStruct
    {


    };
#ifdef __cplusplus 
}
#endif 

答案 2 :(得分:1)

extern struct YourStruct *yourstruct_instance;

在其中一个标题中应该完成这项工作。

答案 3 :(得分:0)

从c库导出结构的实例。让C ++库包含来自c库的头文件。

在C库的.h文件中:

#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) struct MyStruct
{
    // members
}
extern __declspec(dllexport) struct MyStruct myInstance;
#ifdef __cplusplus
}
#endif

在C库的.c文件中:

__declspec(dllexport) struct MyStruct myInstance;

然后,您的c和c ++代码可以操作myInstance

有关详细信息,请参阅this文章。另外,尝试创建一个新的C ++ DLL项目并检查“导出符号”框。这将创建一个带有导出类和该类实例的c ++ dll。在c中对导出的结构执行相同的操作非常相似。