我有一个简单的问题。 我有两个库,一个用C编译,另一个用C ++编译,其中C库由C ++库链接和加载。我需要在C库中声明一个可以读写的结构实例。 你是如何做到这一点的?
由于
编辑:补充说它是一个结构的实例,而不仅仅是声明
答案 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中对导出的结构执行相同的操作非常相似。