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

标签 c constants ada

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

文件.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 更好;您不希望目标文件中的名称被破坏)在 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 源代码中的名称,例如函数中的参数名称。

关于c - 如何将#define 常量从.h 文件导入Ada?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49035610/

相关文章:

c++ - 使用类型别名不适用于 "const"指针

file - Ada:在 block 语句中写入文件

c - 使用 volatile 关键字修改 const 变量

.net - 在 Ada 中使用 .net 命令

Ada 字符串切片

c - C中定义函数的__attribute__(格式)有什么用?

找不到 libsocket.so 和 libintl.so

c - 从目标文件内联函数

c++ - 在运行时生成c/c++程序的动态调用图

c++ - vector::push_back 从 const Type* 到 type* 的转换