有没有办法忽略Ada
函数中的返回值?
我有一个从Intrinsic导入的函数。
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");
如果我想在一个过程中使用它,我需要接受返回值,否则我将得到编译器错误:
cannot use function Intrinsic_Sync_Add_And_Fetch in procedure call.
但是,如果我创建一个只接受函数返回值的变量而从未使用过,那么我会得到编译器警告。显然,我宁愿避免这些。
我不能很好地将值分配给我要添加的值;这会破坏add
操作的原子性。
可以选择使用该值并使用做,例如:
val := Intrinsic_Sync_Add_And_Fetch(...);
if val := 0 then null; end if;
它强制代码编译时没有错误或警告,但对我来说似乎很愚蠢。如何“绕过”此语言功能并安全地忽略返回值?
编辑:什么是__sync_add_and_fetch_4?
这是Intel CPU上可用的内置原子操作。因此,我的Autoconf
/ Automake
进程的一部分将决定操作是否可用,并使用涉及临界区的回退实现,如果不是的话。
您可以在GCC's section on 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;
}
所以这是一个原子加法运算,它返回加法的结果。基本上,它是一个原子+=
运算符。 _4
表示它需要一个4字节的整数。
编辑 :我知道我可能只是关闭了特定的编译器警告,但这对我来说总是让人感觉很脏。如果有可用的解决方案允许我继续使用-Wall -Werror
,那么我很乐意看到它。
答案 0 :(得分:4)
declare
dummy : constant return_type := my_function;
pragma Unreferenced (dummy);
begin null; end;
或编写包装程序。
答案 1 :(得分:3)
如果您不想引用返回值,为什么不将子程序声明为过程?该值将在寄存器中返回,因此扔掉它不会引起很多悲伤。 (我会在这个问题上得到纠正!)
subtype int32 is Interfaces.Integer_32;
procedure Intrinsic_Sync_Add_And_Fetch
(P : access int32; I : int32);
pragma Import(
Intrinsic,
Intrinsic_Sync_Add_And_Fetch,
"__sync_add_and_fetch_4");
答案 2 :(得分:3)
你说你只是针对GNAT编译器。 GNAT User's Guide说:
请注意,特殊豁免适用于任何包含任何子字符串DISCARD,DUMMY,IGNORE,JUNK,UNUSED的变量。这些变量被认为可能是在有其他情况下会发出警告的情况下故意使用的,因此这类警告总是会被抑制。
因此,解决您问题的最简单方法是:
unused := Intrinsic_Sync_Add_And_Fetch(...);
虽然您可能希望将其包装在一个程序中,如果您打算多次使用它:
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;
答案 3 :(得分:0)
我不知道如何忽略Ada中函数的返回值:该语言专门用于强制您存储这些返回值。
就个人而言,我会存储返回值并忽略有关变量使用的任何警告。无论如何,所述警告很奇怪,因为变量确实用于存储返回值。