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

Ste*_*isk 1 c constants ada

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

file.h

#define TEST 0x1234
Run Code Online (Sandbox Code Playgroud)

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

Sim*_*ght 7

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

TEST : constant := 16#1234#;
Run Code Online (Sandbox Code Playgroud)

如果你想自动维护C和Ada之间的关系,你可以得到gcc(或者,更好,g++最后看到)做咕噜咕噜的工作.鉴于sterisk.hh包含你的例子,

#define TEST 0x1234
Run Code Online (Sandbox Code Playgroud)

用它编译它

g++ -c -fdump-ada-spec sterisk.hh
Run Code Online (Sandbox Code Playgroud)

产生的 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;
Run Code Online (Sandbox Code Playgroud)

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

#include "sterisk.hh"

const int _name_thats_unlikely_to_clash = TEST;
Run Code Online (Sandbox Code Playgroud)

并编译为sterisk.o:

gcc -c sterisk.c
Run Code Online (Sandbox Code Playgroud)

然后,在你的Ada来源:

Test : constant Integer
with
  Import,
  External_Name => "_name_thats_unlikely_to_clash";
Run Code Online (Sandbox Code Playgroud)

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

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

gnatmake foo.adb -largs sterisk.o
Run Code Online (Sandbox Code Playgroud)

为什么g++比这更好gcc?因为g++保留了C源中的更多名称,例如函数中的参数名称.