我遇到与此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;
答案 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标头上使用gcc开关-fdump-ada-spec
。见Generating Ada Bindings for C and C++ headers