在Ada'中使用C常量;s模型界

在Ada'中使用C常量;s模型界,ada,gnat,Ada,Gnat,我有一个类似的问题,目前在这一点上 我想在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中使用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;

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

const unsigned major\u num=7

除非可能使用-O0,否则在生成的对象文件中找不到major_num。尝试在任何对象文件上使用nm(对于C或Ada,无所谓)进行检查

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

MAJOR\u NUM:constant Interfaces.C.unsigned:=7


最简单的方法是在C头上使用gcc开关
-fdump ada spec
。请参见编译时常量通常直接用于生成的汇编代码中,并且不能从gcc中的任何语言导入或导出。也就是说,如果您的C代码确实包含

const unsigned major\u num=7

除非可能使用-O0,否则在生成的对象文件中找不到major_num。尝试在任何对象文件上使用nm(对于C或Ada,无所谓)进行检查

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

MAJOR\u NUM:constant Interfaces.C.unsigned:=7


最简单的方法是在C头上使用gcc开关
-fdump ada spec
。请参见

@RuudHelderman抱歉,复制了错误的代码部分。即使是
const unsigned major=7,它也不起作用感谢您的编辑。似乎Ada对
mod
非常挑剔。除非有人提出了一个绝妙的想法,否则你可能会被迫求助于
范围
;这是一个选项吗?对于
Major\u Type
,您需要哪些模块化类型的功能?@jacobsparrenadersen,@Ruud谢谢。再想一想,实际上我不必选择
mod
。我有一个概念,这是无符号C类型所需要的。@RuudHelderman抱歉,复制了错误的代码部分。即使是
const unsigned major=7,它也不起作用感谢您的编辑。似乎Ada对
mod
非常挑剔。除非有人提出了一个绝妙的想法,否则你可能会被迫求助于
范围
;这是一个选项吗?对于
Major\u Type
,您需要哪些模块化类型的功能?@jacobsparrenadersen,@Ruud谢谢。再想一想,实际上我不必选择
mod
。我有一个概念,这是无符号C类型所需要的。顺便说一句,你确定你想要一个具有环绕语义和模数为7的模块类型吗?这在C语言中根本不存在。@REE,谢谢。你写的不是我的经历。只要不使用接口常量值并定义模块化类型的大小,接口常量值就可以正常工作。数字7只是一个例子(我同意这是一个糟糕的例子)。最终我放弃了使用
mod
的想法。顺便问一下,你确定你想要一个具有环绕语义的模块类型,并且模数为7吗?这在C语言中根本不存在。@REE,谢谢。你写的不是我的经历。只要不使用接口常量值并定义模块化类型的大小,接口常量值就可以正常工作。数字7只是一个例子(我同意这是一个糟糕的例子)。最终我放弃了使用
mod
的想法。