在Ada的模块类型绑定中使用的C常量

时间:2017-11-12 21:02:34

标签: ada gnat

我遇到与此question中存在的问题类似的问题。

我想在Ada中使用C常量作为模块类型的范围。

不幸的是我收到了错误:

linux-char_device.ads:52:27: non-static expression used for modular type bound
linux-char_device.ads:52:27: "MAJOR_NUM" is not a static constant (RM 4.9(5))

C代码是:

const unsigned major_num = 7;

Ada代码是:

MAJOR_NUM : constant Interfaces.C.unsigned;
pragma Import (
   Convention    => C,
   Entity        => MAJOR_NUM,
   External_Name => "major_num"
);

type Major_Type is mod MAJOR_NUM;

1 个答案:

答案 0 :(得分:2)

编译时常量通常直接用于生成的汇编程序代码中,并且永远不能从gcc中的任何语言导入或导出。也就是说,如果您的C代码确实包含

const unsigned major_num = 7;

你不会在生成的目标文件中找到major_num,除非你使用-O0。在任何目标文件(对于C或Ada,无关紧要)上尝试nm来检查。

因此,您无法在Ada中导入编译时常量。如果要为某些C(或C ++)函数创建Ada绑定,则必须将C常量重新声明为Ada常量:

MAJOR_NUM : constant Interfaces.C.unsigned := 7;

最简单的方法是在C标头上使用g​​cc开关-fdump-ada-spec。见Generating Ada Bindings for C and C++ headers