Delphi XE中LongWord和Cardinal之间的区别?

Delphi XE中LongWord和Cardinal之间的区别?,delphi,constants,delphi-xe,typed,Delphi,Constants,Delphi Xe,Typed,此代码不在XE中编译: const InitSignature : array[0..3] of LongWord = ($67452301, $EFCDAB89, $98BADCFE, $10325476); [DCC错误]:需要E2026常量表达式 但这确实: const InitSignature : array[0..3] of Cardinal = ($67452301, $EFCDAB89, $98BADCFE, $10325476); 可

此代码不在XE中编译:

const
    InitSignature : array[0..3] of LongWord =
        ($67452301, $EFCDAB89, $98BADCFE, $10325476);
[DCC错误]:需要E2026常量表达式

但这确实:

const
    InitSignature : array[0..3] of Cardinal =
    ($67452301, $EFCDAB89, $98BADCFE, $10325476);
可赋值类型常量处于启用状态

如果我在第一个示例中将所有数组值强制转换为LongWord,代码将编译。
但是我不知道LongWord和Cardinal有什么区别?

我要大胆一点,说“没有区别”。不知何故,你得出了错误的结论,并且没有向我们提供足够的信息来帮助你。我确信你没有在这里粘贴代码的1:1副本,并且遗漏了一些相关内容

可能是一个邪恶的同事,他在左括号前粘贴了一个不可见的unicode字符,并在其他地方将该字符定义为函数。它也可能是更明显的东西


你能在一个干净的项目中重现这个问题吗?因为我很确定你不能。如果可以,请发回。如果不能,请发布更多上下文。无论如何,请证明我错了。

下面的代码在Delphi XE中编译得很好

向我们展示您的代码的更多上下文;似乎有什么东西为你重新定义了LongWord


-jeroen

您的代码中可能有一个名为longword的函数

function LongWord: Integer;
begin
 result := 0;
end;

procedure Foo;
const
    InitSignature : array[0..3] of LongWord =
        ($67452301, $EFCDAB89, $98BADCFE, $10325476);
begin
  //...
end;

在D2007中编译得很好。根据,仍然不应该有区别。同意,应该没有区别,即使64位版本出来,也不会有区别。这是一个兼容性问题。实际上Integer/Cardinal应该是独立于机器的,但是iirc它们是固定的,所以LongWord是64位的,Cardinal是32位的:/在安装了更新1的Delphi XE中对我来说很好。@Llyod:LongWord不是64位的,并且在即将到来的64位编译器中不会是64位的。它必须是一个很棒的重新定义才能触发预期的常量表达式。我最接近的猜测是将其定义为一个4参数函数,然后不知何故忘记键入等号。也许一个带有赋值操作符的记录就可以解决这个问题?或者OP只需要安装Rad XE update 1,这就解决了一个问题。或者OP使用的代码具有可爱的函数名,比如函数LongWord:Boolean;
function LongWord: Integer;
begin
 result := 0;
end;

procedure Foo;
const
    InitSignature : array[0..3] of LongWord =
        ($67452301, $EFCDAB89, $98BADCFE, $10325476);
begin
  //...
end;