忽略 Ada 函数返回值

Ant*_*ony 4 language-features ada

有没有办法忽略Ada函数中的返回值?

我有一个从内部导入的函数。

subtype int32 is Interfaces.Interger_32;

function Intrinsic_Sync_Add_And_Fetch
    (P : access int32; I : int32) return int32;

pragma Import(
            Intrinsic, 
            Intrinsic_Sync_Add_And_Fetch, 
            "__sync_add_and_fetch_4");
Run Code Online (Sandbox Code Playgroud)

如果我想在一个过程中使用它,我需要接受返回值,否则我会得到一个编译器错误:

cannot use function Intrinsic_Sync_Add_And_Fetch in procedure call.
Run Code Online (Sandbox Code Playgroud)

但是,如果我创建了一个只接受函数返回值并且从未使用过的变量,那么我会收到编译器警告。显然,我宁愿避免这些。

我不能很好地将值分配我要添加的值;这会破坏add操作的原子性。

可以选择获取价值并用它做一些事情,例如:

val := Intrinsic_Sync_Add_And_Fetch(...);
if val := 0 then null; end if;
Run Code Online (Sandbox Code Playgroud)

它强制代码在没有错误或警告的情况下编译,但对我来说似乎很愚蠢。我怎样才能“绕过”这个语言特性并安全地忽略返回值?

编辑:什么是 __sync_add_and_fetch_4?

这是 Intel CPU 上可用的内置原子操作。因此,我的Autoconf/Automake流程的一部分将决定操作是否可用,如果不可用,则使用涉及关键部分的回退实现。

您可以在GCC 的 atomic builtins 部分阅读有关此操作和类似操作的信息

__sync_add_and_fetch_4做几乎正是它说。在 中C,它看起来像这样:

int32_t __sync_add_and_fetch_4(int32_t *ptr, int32_t value) {
    *ptr += value;
    return *ptr;
}
Run Code Online (Sandbox Code Playgroud)

所以它是一个原子加法操作,它返回加法的结果。基本上,它是一个原子+=运算符。这_4意味着它需要一个 4 字节的整数。

编辑:我知道我可能只是关闭那个特定的编译器警告,但这对我来说总是很脏。如果有可用的解决方案可以让我继续使用,-Wall -Werror那么我很乐意看到它。

oen*_*one 5

declare
   dummy : constant return_type := my_function;
   pragma Unreferenced (dummy);
begin null; end;
Run Code Online (Sandbox Code Playgroud)

或者写一个包装程序。


小智 5

你说过你只针对 GNAT 编译器。GNAT 用户指南说:

请注意,特殊豁免适用于包含任何大小写的 DISCARD、DUMMY、IGNORE、JUNK、UNUSED 子字符串的变量。此类变量被认为可能是在本来会发出警告的情况下有意使用的,因此此类变量的此类警告始终受到抑制。

所以解决你的问题的最简单的解决方案是:

unused := Intrinsic_Sync_Add_And_Fetch(...);
Run Code Online (Sandbox Code Playgroud)

不过,如果您要多次使用它,您可能希望将其包装在一个过程中:

procedure Intrinsic_Sync_Add_And_Fetch(P : access int32; I : int32) is
   unused : int32;
begin
   unused := Intrinsic_Sync_Add_And_Fetch(P : access int32; I : int32);
end Intrinsic_Sync_Add_And_Fetch;
Run Code Online (Sandbox Code Playgroud)