gpt4 book ai didi

delphi - 将 Delphi 2009/2010 字符串文字转换为 PAnsiChar

转载 作者:行者123 更新时间:2023-12-03 15:37:35 27 4
gpt4 key购买 nike

所以问题是 Delphi 2009/2010 中的字符串文字(或常量字符串)是否可以直接转换为 PAnsiChar,或者是否需要先额外转换为 AnsiString 才能正常工作?

背景是我正在使用 C 接口(interface)调用旧 DLL 中的函数,该接口(interface)具有一些需要 C 样式字符指针的函数。在过去(Delphi 2009 之前),像下面这样的代码就像一个魅力(其中 C DLL 函数的参数是 LPCSTR):

或者:

LegacyFunction(PChar('Fred'));

const
FRED = 'Fred';
...
LegacyFunction(PChar(FRED));

因此,在更改为 Delphi 2009(现在是 2010 年)时,我将调用更改为:

LegacyFunction(PAnsiChar('Fred'));

const
FRED = 'Fred';
...
LegacyFunction(PAnsiChar(FRED));

这似乎有效,我从函数调用中得到了正确的结果。然而,应用程序中存在一些明显的不稳定性,这似乎主要是通过调用旧函数的代码第二次或第三次发生的(在迁移到 2009 版本的 IDE 之前不存在)。在调查这个问题时,我意识到 Delphi 2009/2010 中的 native 字符串文字(和 const 字符串)是一个 Unicode 字符串,因此我的转换可能有错误。这里和其他地方的例子似乎表明这个调用应该看起来更像这样:

LegacyFunction(PAnsiChar(AnsiString('Fred')))

令我困惑的是,使用上面第二个示例中的代码,将字符串文字直接转换为 PAnsiChar 不会生成任何编译器警告。如果我不是字符串文字,而是转换字符串 var,我会收到可疑的转换警告(并且字符串将被破坏)。这(以及该字符串在 DLL 中可用的事实)让我相信编译器正在执行一些魔法来将字符串文字正确解释为预期的字符串类型。这是正在发生的事情还是双重转换(首先到 AnsiString,然后到 PAnsiChar)确实有必要,而我的代码中缺乏它是难以追踪不稳定的原因?同样的答案也适用于 const 字符串吗?

最佳答案

对于类型推断常量(只能从文字初始化),编译器在编译时而不是运行时更改实际文本。这意味着它知道转换是否会丢失数据,因此如果没有,它不需要警告您。

关于delphi - 将 Delphi 2009/2010 字符串文字转换为 PAnsiChar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2007287/

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