【问题标题】:Sharing a variable between C and C++ libraries dilemma在 C 和 C++ 库之间共享变量的困境
【发布时间】:2011-05-03 08:57:30
【问题描述】:

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

谢谢

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

【问题讨论】:

  • 库不是一种通信机制。
  • @unapersson 他没有将库用作“通信机制”。他希望在图书馆之间共享数据。注意错误。

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


【解决方案1】:

您需要创建一个包含在 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

【讨论】:

  • 强制说明:全局变量是邪恶的,请考虑将参数传递给函数。
【解决方案2】:

使用外部 C 链接规范。

#ifdef __cplusplus 
extern "C" {
#endif 

    struct YourStruct
    {


    };
#ifdef __cplusplus 
}
#endif 

【讨论】:

  • 不就是导出结构声明吗?我想分享一个结构实例,如果不清楚,对不起
  • @KaiserJohaan:是的,但是 extern "C" 块的工作方式与实例和函数的声明相同。
  • @Andy Johnson:谢谢!是的,你是对的。有点仓促的回答,我错过了宏观守卫。进行了修改。
【解决方案3】:
extern struct YourStruct *yourstruct_instance;

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

【讨论】:

    【解决方案4】:

    从您的 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 中对导出的结构执行相同的操作非常相似。

    【讨论】:

      猜你喜欢
      • 2012-10-27
      • 2013-07-26
      • 2018-04-25
      • 2011-09-14
      • 1970-01-01
      • 2015-03-28
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多