【发布时间】:2014-09-12 21:47:54
【问题描述】:
这个程序
{$APPTYPE CONSOLE}
{$TYPEDADDRESS ON}
uses
Winapi.Windows;
procedure Foo(P: PDWORD);
begin
end;
procedure Bar;
var
dw: DWORD;
begin
Foo(@dw);
end;
begin
end.
在 XE3 中编译,但在 XE4、XE5、XE6 和 XE7 中不编译。错误在
Foo(@dw);
[dcc32 错误] E2010 不兼容的类型:“PDWORD”和“指针”
这感觉很奇怪。因此,经过一番挖掘,似乎问题归结为PDWORD 的定义。人们可能很自然地认为它会是:
PDWORD = ^DWORD;
在 XE3 中确实如此。在以后的版本中,我们发现:
// Note: Not ^DWORD yet
PDWORD = ^CppULongInt;
奇怪。那么,CppULongInt 是什么?
CppULongInt = type LongWord;
{$EXTERNALSYM CppULongInt 'unsigned long'}
{$OBJTYPENAME CppULongInt 'Bul' 'Gm'}
然后查看DWORD 的声明,我们发现:
//NOTE: DWORD should really be CppULongInt
DWORD = LongWord;
所以,CppULongInt 和 DWORD 是不同的类型。因此编译错误。
这里发生了什么? CppULongInt 的目的是什么?为什么 RTL 设计者似乎想要将 DWORD 别名为 CppULongInt。此更改是否与基于 LLVM 的 x64 Windows C++ 编译器有关?我是世界上唯一使用{$TYPEDADDRESS ON} 的人吗?
注意,最后一个问题是反问。
【问题讨论】:
-
我注意到了。将一个类型的指针定义为一个类型的指针,而不是它自己的类型,这很奇怪。
-
@Sertac CppULongInt 这个名字让我感到恐惧。就好像他们忘记了 Delphi 的存在。我认为当事情朝另一个方向发展时,情况会发生变化。
-
我忍不住 :) - sergworks.wordpress.com/2014/09/13/…
-
那么,“为什么 PDWord 不是 ^DWORD?” 的可能答案 - 有一个开发人员无法从别名中分辨出类型。 - 有一个开发人员对
PDWORD和DWORD之间的关系一无所知。 - @Serge 的理论涉及更多开发人员,这相当于“有一个开发团队不给 f..”。
标签: delphi delphi-xe4