如何将.h文件中的#define常量导入Ada?

时间:2018-02-28 17:43:54

标签: c constants ada

我正在尝试将常量从C移动到位于头文件中的Ada。

file.h

#define TEST 0x1234

如何将此常量导出到ada?我知道要导出函数并将它们导入到ada中,但我似乎无法弄清楚如何对常量做同样的事情。

1 个答案:

答案 0 :(得分:7)

如果您正在询问如何手动编写此常量的Ada表示,那么答案就是

TEST : constant := 16#1234#;

如果您想自动维护C和Ada之间的关系,您可以gcc(或更好,g++;最后看到)来完成繁重的工作。给定sterisk.hh包含您的示例

#define TEST 0x1234

编译
g++ -c -fdump-ada-spec sterisk.hh

sterisk_hh.ads

中生成
pragma Ada_2005;
pragma Style_Checks (Off);

with Interfaces.C; use Interfaces.C;

package sterisk_hh is

   TEST : constant := 16#1234#;  --  sterisk.hh:1

end sterisk_hh;

第三种方法是创建一个包含标题的小C源(这里C更好;你不希望名称在目标文件中被破坏),比如sterisk.c

#include "sterisk.hh"

const int _name_thats_unlikely_to_clash = TEST;

并编译为sterisk.o

gcc -c sterisk.c

然后,在你的Ada来源:

Test : constant Integer
with
  Import,
  External_Name => "_name_thats_unlikely_to_clash";

当然,这种方式意味着您必须决定常量的特定类型,并且必须匹配C类型。

此外,您需要在链接中包含C对象文件:

gnatmake foo.adb -largs sterisk.o

为什么g++优于gcc?因为g++保留了C源中的更多名称,例如函数中的参数名称。