我正在尝试将一个常量从C移动到位于头文件中的Ada.
file.h
#define TEST 0x1234
Run Code Online (Sandbox Code Playgroud)
我如何将此常量导出到ada?我知道导出函数并将它们导入ada但我似乎无法弄清楚如何对常量做同样的事情.
如果您正在询问如何手动编写此常量的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源中的更多名称,例如函数中的参数名称.
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |