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那么我很乐意看到它。
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)