如何将#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 源代码中保留了更多名称,例如函数中的参数名称。
我正在尝试将常量从 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 源代码中保留了更多名称,例如函数中的参数名称。