gpt4 book ai didi

delphi - 为什么 SetString 内在函数可能会导致 PChar 参数出现 "Incompatible types"错误?

转载 作者:行者123 更新时间:2023-12-03 15:18:26 24 4
gpt4 key购买 nike

请原谅这个愚蠢的问题,但我很困惑。考虑以下方法(抱歉有吵闹的评论,这是正在开发的真实代码):

function HLanguages.GetISO639LangName(Index: Integer): string;
const
MaxIso639LangName = 9; { see msdn.microsoft.com/en-us/library/windows/desktop/dd373848 }
var
LCData: array[0..MaxIso639LangName-1] of Char;
Length: Integer;
begin
{ TODO : GetLocaleStr sucks, write proper implementation }
//Result := GetLocaleStr(LocaleID[Index], LOCALE_SISO639LANGNAME, '??');
Length := GetLocaleInfo(LocaleID[Index], LOCALE_SISO639LANGNAME, @LCData, System.Length(LCData));
Win32Check(Length <> 0);
SetString(Result, @LCData, Length); // "E2008 Incompatible types" here, but why?
end;

如果我删除引用运算符,则来自 $X+ 的隐式转换将发挥作用并编译方法。为什么编译器拒绝这个带有引用运算符的代码超出了我的理解。

这是 Delphi XE2,此行为可能是它特有的。

<小时/>

如果我在 HLanguages.GetISO639LangName 范围内添加一个具有等效原型(prototype)的测试用例虚拟作为内在原型(prototype),此错误将神奇地消失:

procedure SetString(var s: string; buffer: PChar; len: Integer);
begin
{ test case dummy }
end;

最佳答案

您必须将其显式转换为 PChar:

SetString(result,PChar(@LCData),Length); 

正如您所说,SetString() 对第二个参数类型的要求非常高。它必须是 PCharPWideCharPAnsiChar,具体取决于字符串类型本身。

我怀疑这是由于 SetString() 被定义为重载了 stringWideStringAnsiString 作为第一个参数。因此,为了验证正确的签名,需要所有参数类型完全匹配:

SetString(var s: string; buf: PChar; len: integer); overload;
SetString(var s: AnsiString; buf: PAnsiChar; len: integer); overload;
SetString(var s: WideString; buf: PWideChar; len: integer); overload;

当然,所有这些都是“内在的”,所以你不会在system.pas中找到这样的定义,而是直接像_LStrFromPCharLen() _UStrFromPCharLen() _WStrFromPWCharLen()这样的过程。

此行为自 Delphi 的早期版本以来都是相同的,并且不是 XE2 中的回归。

关于delphi - 为什么 SetString 内在函数可能会导致 PChar 参数出现 "Incompatible types"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13614737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com