【发布时间】:2016-08-30 15:46:59
【问题描述】:
在一个新的 Win32 项目中,我有以下 Delphi 函数:
procedure SetValue(value1, value2 : Extended);
begin
end;
在同一个项目中,但来自 C++ 单元,我调用了这个函数:
SetValue(10, 40);
当我使用 BCC32C (CLang) 编译时检查 value1 时,我得到 1.68132090507504896E-4932,这是不正确的。
用 BCC32(经典)编译,我得到 10。
在这两种情况下,第二个参数都是 40。
Extended 值和参数堆栈加载似乎有问题。
我使用 RAD Studio 10.1 Berlin。
我该如何解决这个问题?
更新
我没有包含声明,因为 hpp 是在编译时自动创建的。无论如何,声明是:
extern DELPHI_PACKAGE void __fastcall SetValue(System::Extended value1, System::Extended value2);
复制项目:
1-在 Rad Studio 中创建 C++ 项目
2-用上面的SetValue函数添加一个Delphi单元
3-从C++单元中,用#include添加hpp头并调用SetValue
就是这样。
我需要使用扩展类型。我正在使用外部 Delphi 库,因此无法更改类型。上面的代码是对问题的简化。实际上,问题在于调用该库的函数,该函数在参数中使用了 Extended。 Extended 在 Delphi 中是本机类型,但在 C++ 中它映射为 long double、10 字节(对于 Win32)。
【问题讨论】:
-
从外部应用程序调用该函数时不应该将其标记为cdecl吗?
-
如何在 C++ 代码中声明函数?
-
停止使用
Extended。这是个坏主意。使用Double或Real(Double的别名)。您只需要展示调用约定和您的 C++ 代码,我们就有机会。为什么我们不能有minimal reproducible example?我在我见过的所有问题中只问了一半。当然,消息正在传递....... -
@JoachimPileborg 当为 C++ 编译 Delphi 单元时,Delphi 编译器会自动生成 C++
.hpp头文件。希望 OP 使用该标头而不是手动声明该函数。 -
@GuidoG 不,调用约定不需要是
cdecl。并且该函数没有被外部应用程序调用。 Delphi 代码可以直接在 C++Builder 项目中使用。
标签: delphi clang c++builder delphi-10.1-berlin c++builder-10.1-berlin