C绑定到Ada包

C绑定到Ada包,c,binding,ada,C,Binding,Ada,虽然我可以找到大量关于生成到C库的Ada绑定的信息,但我似乎找不到任何相反的信息。具体地说,我有一些数学/科学软件包,我想导出到C,使它们更广泛地使用。通过pragmas/aspects导出函数或过程很容易,但我对如何处理Ada中声明的类型感到困惑 比如说,我有一个实现单元不可知平面角的包。除了算术运算符外,还有用于处理不同单位的函数,如度(«值»)返回«角度»作为构造函数,梯度(«角度»)返回«值»作为访问器。这样,就有了一个经过仔细挑选的通用表示,允许程序员使用任何单元 我困惑的是,当函数或

虽然我可以找到大量关于生成到C库的Ada绑定的信息,但我似乎找不到任何相反的信息。具体地说,我有一些数学/科学软件包,我想导出到C,使它们更广泛地使用。通过pragmas/aspects导出函数或过程很容易,但我对如何处理Ada中声明的类型感到困惑

比如说,我有一个实现单元不可知平面角的包。除了算术运算符外,还有用于处理不同单位的函数,如度(«值»)返回«角度»作为构造函数,梯度(«角度»)返回«值»作为访问器。这样,就有了一个经过仔细挑选的通用表示,允许程序员使用任何单元

我困惑的是,当函数或过程被导出时,C如何知道和理解它要传递的角度类型

编辑: 好的,所以我在类型中添加了“with Export,Convention=>C;”,而不应该有“Export”。愚蠢的疏忽

仍然密切相关,我现在不知道如何从C调用代码。如上所述,有大量关于从C导入内容的文档,但即使是LRM也没有提供将内容导出到C的示例


我知道C通过预处理器包括库/文件,特别是“#include”指令。但是我认为这是行不通的,因为C编译器会尝试解析Ada规范。那么C是如何看待Ada的呢?

你不会告诉C Ada类型是什么样的。您告诉Ada使用C
约定
方面以C程序可用的方式表示类型。表示子句也有帮助,因此您可以告诉Ada以特定的方式布置类型;这样,您可以强制它看起来与类似的C
struct
相同。有关更多信息,请参阅。小心使用Ada访问类型;Ada提供了
接口。C.Pointers
来声明与C指针兼容的类型。如果遇到困难,请发布一些特定的Ada代码,希望可以从C中使用。@ajb:Ada stuff现在可以编译了,但我不知道如何让C识别Ada定义的内容。有关详细信息,请参见编辑。我认为这个问题很普遍,不需要任何来源。如果我错了,我会发布源代码。发布源代码会对您有所帮助。但底线是你的问题是错误的;除了子程序的
External\u Name
Link\u Name
之外,您无法让C查看Ada内容。或者,如果您的Ada编译器附带了生成C
.h
文件的工具,那么您的C程序可以包含这些文件。但是,一般来说,您必须编写类型的C版本,然后使用Ada方面、pragmas和表示子句来确保表示匹配。如果您不确定如何使用,请发布一些代码。不要忘记Ada代码的精化。您需要让您的C程序调用生成的精化子程序(adainit和adafinal)。这里最简单的方法是通过项目文件进行构建,并在文档中查找“独立库”。