如何使用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警告] U_Calc1.pas(114):W1050 WideChar在集合表达式中减少为字节char。考虑在'SysUtils'单元中使用'CharInSet'功能。
答案 0 :(得分:6)
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 集合中的成员资格(即单字节)字符)。
明确的类型转换有一个优点(imho),使得它明确且明显地表示你的代码是故意期望并且仅使用ASCII字符,而不是给出一个可能误导的印象处理Unicode的功能更齐全。