gpt4 book ai didi

delphi - 在 Delphi 或 Firemonkey 中使用 CharInSet

转载 作者:行者123 更新时间:2023-12-03 15:19:53 25 4
gpt4 key购买 nike

如何使用 CharInSet() 消除此警告?

lastop:=c;
{OK - if op is * or / and prev op was + or -, put the whole thing in parens}
If (c in ['*','/']) and (NextToLastOp in ['+','-']) then
Result.text:='('+Result.text+')';
Result.text:=Result.text+c;

[dcc32 Warning] U_Calc1.pas(114): W1050 WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit.

最佳答案

CharInSet 是必要的,因为 WideChar 值太大而无法在实际设置操作中使用。

要在代码中使用它,您可以像这样使用它:

If (CharInSet(c, ['*','/']) and (CharInSet(NextToLastOp, ['+','-']) then

但是,除了消除警告之外,CharInSet 实际上并没有做任何特殊的事情,甚至没有做任何有用的事情。

函数中的代码与其替换的代码相同。警告被静音只是因为 RTL 单元是预编译的。即使您执行完整的“重建全部”,编译器也不会重新编译它们。即 SysUtils 中的代码实际上从未重新编译过。如果是的话,它会发出完全相同的警告。

因此,您可以使用该函数来避免警告,但如果您可以确定您的字符数据是 ASCII(或扩展 ASCII),即序数值在 #0 到 #255 范围内,那么您也可以通过将字符变量显式转换为 ANSIChar 来避免警告:

If (ANSIChar(c) in ['*','/']) and (ANSIChar(NextToLastOp) in ['+','-']) then

重申:如果您绝对确定您正在使用的角色数据包含,则您应该执行此操作仅 ASCII 字符。

但同样的警告同样适用于使用 CharInSet,因为这仍然要求您测试 ANSIChar 集中的成员资格(即单字节)字符)。

显式类型转换的优点(恕我直言)可以明确且明显地表明您的代码有意故意期望仅使用 ASCII 字符,而不是给人一种可能会产生误导的印象更全面地处理 Unicode。

关于delphi - 在 Delphi 或 Firemonkey 中使用 CharInSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43360192/

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