@H_403_1@我正在设计一个用于应用程序的通信中间件,该应用程序在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变体记录也是如此)
解决方法
有可能.
Ada 2005提供了Unchecked_Union编译指示,它允许程序“[指定]给定的区分类型和某些C联合之间的接口对应关系.该编译指示指定相关类型应给出一个表示不为其判别式留下空间的表示. “.
从我阅读RM部分开始,我们声明一个Ada类型,其中包含定义变体记录所需的判别式,但没有为判别式分配存储空间.我认为这在Ada方面意味着随后不能引用判别式. (还有其他限制,例如所有字段必须是C兼容的,有关详细信息,请参阅RM B.3.3.)
我从来没有使用过这个pragma,我不禁想到它需要一些实验才能(希望)与你的系统一起工作.祝好运!