我正在尝试将位于头文件中的常量从 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/