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

How to import #define constants from .h file to Ada?

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

file.h

#define TEST 0x1234

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

如果你问如何手写这个常量的 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;

第三种方法是创建一个包含 header 的小型 C 源代码(这里 C 更好;您不希望名称在 object 文件中被破坏)说 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 类型。

此外,您需要在 link 中包含 C object 文件:

gnatmake foo.adb -largs sterisk.o

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