gpt4 book ai didi

generics - 有没有办法在 Ada(特别是 GNAT)中创建和重用方面集?

转载 作者:行者123 更新时间:2023-12-01 21:20:05 26 4
gpt4 key购买 nike

在 C/C++ 中,我经常使用预处理器来定义基于公共(public)基本过程(是的,我知道,C 中的函数)的过程。

例如(名称、类型和值是假设的):

// in some .h file
void some_base_procedure(int a, char c);

#define proc1(a) some_base_procedure(a, 'd')
#define proc2(a) some_base_procedure(a, 'e')
#define proc3(a) some_base_procedure(a, 'f')

我看过 Ada 中的泛型并将它们用于包,但对于子程序我不确定如何干净利落地做类似于上述 C 示例的事情。

不过我确实想出了这个:

-- in some .ads file
procedure some_base(a:integer; c: character);

procedure proc1(a:integer; b: character := 'd') with
Import => True,
Address => some_base'Address;
procedure proc2(a:integer; b: character := 'e') with
Import => True,
Address => some_base'Address;
procedure proc3(a:integer; b: character := 'f') with
Import => True,
Address => some_base'Address;

这实际上工作得很好,我只需要在相关的 .adb 文件中为 some_base 实现一个主体,而我不必实现只使用正确的参数值调用 some_base 的 proc1、proc2、proc3 子程序主体。在我的一些用例中,虽然我有更多的方面,但只有导入和地址,所以这可能无法很好地扩展。

由于找不到更好的术语,我将这些称为参数化子程序别名

上述方法的一些问题:

  1. 仍然可以在对 proc1、proc2 或 proc3 的调用中覆盖 b。这是次要的,因为必须有意这样做(为了什么目的?)
  2. 它可能被认为通常不是 Ada 做事的方式(可能被认为是 C'ism)并且可能有更简洁的方式来使用泛型,但如果它涉及每个子程序单独的 ads/adb,那么对于如上所述的这种简单用例来说就太冗长了。
  3. 如果每个 parameterized subprogram alias 的 aspects 变成几行,那现在在维护期间更需要更新,并且成为一个类似的维护问题,因为每个 parameterized subprogram alias 都需要显式主体.

所以我的问题是关于上面最后一点的。

有没有办法将 Import => True, Address => some_base'Address; 放入某种方面集,然后为每个参数化子程序别名?

所以它会像这样(aspect_set使用 some_base_set,...弥补了这个例子):

-- in some .ads file
procedure some_base(a:integer; c: character);
aspect_set some_base_set is Import => True, Address => some_base'Address;

procedure proc1(a:integer; b: character := 'd') using some_base_set;
procedure proc2(a:integer; b: character := 'e') using some_base_set;
procedure proc3(a:integer; b: character := 'f') using some_base_set;

即使没有,我认为我的上述方法已经足够好了,除非有人令人信服地指出为什么这是一个非常糟糕的方法,并且有一个更具表现力的类似 Ada 的方式 做这样的事情。

最佳答案

深入研究后,我找到了一个更通用的解决方案。

-- in some .ads file
procedure some_base(a:integer; c: character);
procedure proc1(a:integer; b: character := 'd') renames some_base;
procedure proc2(a:integer; b: character := 'e') renames some_base;
procedure proc3(a:integer; b: character := 'f') renames some_base;

这比我使用的更干净,即使仍然可以覆盖默认值,但那是次要的。它解决了维护问题,这首先是问题的重点。

关于generics - 有没有办法在 Ada(特别是 GNAT)中创建和重用方面集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63862416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com