我正在尝试将常量从C移动到位于头文件中的Ada。
file.h
#define TEST 0x1234
如何将此常量导出到ada?我知道要导出函数并将它们导入到ada中,但我似乎无法弄清楚如何对常量做同样的事情。
答案 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源中的更多名称,例如函数中的参数名称。