Ada变体记录可以与C++联合二进制兼容吗?

Gua*_*ita 7 c++ record ada variant unions

我正在设计一个通信中间件,用于在Ada中有一个模块的应用程序和C++中的许多模块,它们传递传递参数(标量值)和结构.该应用程序在MS Windows XP和Windows 7中运行,C++部分正在MSVC++ 2008中开发,Ada部分正在使用GPS/GNAT开发.Ada版本是1995年,但我们正处于编译器迁移(更新版本的GPS/GNAT)的中间,可能会使用更新的Ada规范.

中间件是用C++编写的,我想使用包含在模块之间传递的所有类型的union类型,因此我不需要为系统上使用的每种类型指定一个put/get函数.

问题是,C++联盟是否与Ada变体记录二进制兼容?换句话说,如果我将C++联合传递给Ada代码,它是否能够将其作为Variant记录读取?(反之亦然)

我认为为此可能需要进行一些调整......(例如:C++联盟不包含描述其内容的成员,而Ada变体记录也是如此)

Mar*_*c C 7

有可能.

Ada 2005提供了Unchecked_Union编译指示,它允许程序"[指定]给定的区分类型和某个C联合之间的接口对应关系.该编译指示指定相关类型应给出一个表示不为其判别式留下空间的表示. ".

从我阅读RM部分开始,我们会声明一个Ada类型,其中包含定义变体记录所需的判别式,但没有为判别式分配存储空间.我认为在Ada方面这意味着随后不能引用判别式.(还有其他限制,例如所有字段必须是C兼容的,有关详细信息,请参阅RM B.3.3.)

我从来没有使用过这个pragma,我不禁想到它需要一些实验才能(希望)与你的系统一起工作.祝好运!

  • 一些实验将是找出你是否需要告诉GNAT以MSVC++期望的方式记录记录,如果是这样的话.当然,GNAT了解GCC的惯例; 只要你把自己局限于C联盟和简单的类型,它就不应该太糟糕. (2认同)

NWS*_*NWS 5

是.

Ada与C/C++ Unions兼容.请参阅此处了解如何操作(pdf)特别是第5页显示了如何使用联合和标签.使用判别式记录应该是相同的.(警告:它可能不是您正在使用的编译器,但如果您的行为方式不同,我会非常惊讶!)


MSa*_*ers 2

不。正如您所说,Ada 变体记录包含一个标签字段。C联盟没有这个。(至少在 MSVC++ 和 GCC 中不是这样 - ISO C 允许这样做。)