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

4
我有一个简单的问题。我有两个库,一个是用C编译的,另一个是用C++编译的,其中C库被C++库链接和加载。我需要在C库中声明一个结构体实例,使得两个库都可以读写它。你如何解决这个问题?
谢谢。
编辑:添加了要求是结构体实例而不仅仅是声明。

库不是一种通信机制。 - user2100815
@unapersson他并不是将库用作“通信机制”。他想在库之间共享数据。这没有任何问题。 - Andy Johnson
4个回答

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++客户端,只需包含"yourstruct.h"并引用"yourInstance"即可。
更新: 正如Matthieu所指出的那样,最好传递实例的指针。例如:
#include "yourstruct.h"

#ifdef __cplusplus
extern "C" {
#endif

void yourFunction(YourStruct* someInstance);

#ifdef __cplusplus
}
#endif

2
强制说明:全局变量是邪恶的,请考虑将参数传递给函数。 - Matthieu M.

2

使用extern C链接规范。

#ifdef __cplusplus 
extern "C" {
#endif 

    struct YourStruct
    {


    };
#ifdef __cplusplus 
}
#endif 

这只是导出结构声明吗?我想共享一个结构实例,如果没有表达清楚,对不起。 - KaiserJohaan
@KaiserJohaan:是的,但是extern"C"块对实例和函数的声明的工作方式相同。 - Jan Hudec
@Andy Johnson:谢谢!是的,你说得对。我回答得有点仓促,忘记了宏保护。已经进行了修改。 - Alok Save

1
extern struct YourStruct *yourstruct_instance;

在其中一个标题中应该可以完成这个任务。

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 中进行相同的导出结构体操作非常相似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接