3

我现在想了解如何通过 Interfaces.C 包在 Ada 中传递标准布尔类型以调用 DLL 函数。Interfaces.C 包不包含 Ada Boolean 类型,因为布尔类型在 ANSI C 中不存在。我有一个用 C++ 编写的 DLL 函数,其导出的函数原型有一个 Bool 类型的参数。这是如何在 Intefaces.C 包中传递以调用 DLL 导出函数的?

4

2 回答 2

4

传统上,在 C 中,布尔值用int类型表示。在 C++ 中,bool定义了一个类型,但请注意小写的“b”。如果您的参数是类型的Bool(注意大写的“B”),那么您应该在某处(在您的 C++ 库中)有一个类声明,它将告诉您有关该类型的实现的更多信息。通常,这种 Bool 类通过语言的某些工件与标准 bool 类型兼容:Bool 类不定义虚函数,并将其值保留在一个成员中,该成员明智地放在类定义中的首位。

我没有测试它,但我会说你可以用一种int类型。进行测试以确保它被 C++ 函数接受。为了从 Boolean 转换为int,您可以使用类似Interfaces.C.int(Boolean'Pos(your_bool_value)).

还要注意,正如 Ada 参考手册 [B.3.62] 中所指定的:An implementation may provide additional declarations in the C interface packages.所以检查你的实现Interfaces.C,它可能包含一个bool类型的定义。

于 2009-11-17T13:49:17.103 回答
0
type Boolean_2_Int is (Bool : Boolean := False) is
record
    I : Interfaces.C.Unsigned_Long := 0;
    case Bool is
       when True => 
          I := 1;
       when False => 
          I := 0;
    end case;
end record;
于 2017-03-14T17:28:01.057 回答