【发布时间】:2012-02-09 07:10:13
【问题描述】:
有没有办法忽略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.
但是,如果我创建一个变量,它只接受函数的返回值并且从未使用过,那么我会收到编译器警告。显然,我宁愿避免这些。
我不能很好地将值 back 分配给我要添加的值;这会破坏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 的解决方案,那么我很乐意看到它。
【问题讨论】:
-
由于我不知道“__sync_add_and_fetch_4”操作,您能告诉我/我们关于它的用法吗? P 是您要使用的值,而返回值是您要忽略的值吗?
-
好的,用原子添加操作的小解释更新了问题。是的,我想忽略该函数的返回值。它返回的是操作的结果,它也存储在
P中。我猜它返回相同值的唯一原因是使其可链接。我不需要那个。 -
感谢您的更新,我建议您使用包装器功能。这是因为在 Ada 中,函数的签名包括返回类型,所以要让编译指示导入正常工作(绑定到正确的东西),你需要一个返回值。您的包装函数规范应该看起来像 Simon Wright 建议的那样,并且具有 oenone 建议的内部。
标签: language-features ada