最近我将大量的C++代码移植到Delphi(超过1mb的C代码).代码已满,带有指针.尽管项目编制和的99%的时间运作良好,我看到不时有些怪异的结果时,这使我觉得可能是用的指针操作错误 - 事实上,我已经发现一对夫妇.问题是,如果没有编译器的任何线索/提示,它们很难被追踪.
对于这种情况,也许你有一些提示:
var
a: PSingle;
GetMem(a, SizeOf(Single));
a^ := 1.1;
// Call func declared as - someFunc(aIn: PSingle);
someFunc(@a); // <<-- Bug here. I mistakely added @ while porting.
// someFunc needs PSingle, but gets a PPSingle instead
Run Code Online (Sandbox Code Playgroud)
在示例中,@插入错误.程序不会崩溃,只处理错误的数据并继续运行.我需要一种方法来找到这样的情况,其中"指向值的指针"被传递而不是"指向值的指针".
你如何追踪像这样的指针错误?
Rob*_*edy 12
"typed @ operator"编译器选项旨在准确检测出那种错误.当它被禁用时,表达式@a具有类型Pointer,它与所有指针类型兼容.启用该选项,同一表达式具有^PSingle与预期不兼容的类型PSingle.
我建议在所有项目中启用该选项; 令我感到困惑的是Delphi并没有始终将该选项作为默认选项.
您可以使用$T+and $T-compiler指令修改代码中该选项的状态.
您可以做的另一件事是将代码转换为使用更多惯用的Delphi.例如,通过引用而不是指针值传递参数.更改参数的定义:
procedure someFunc(var arg: Single);
Run Code Online (Sandbox Code Playgroud)
使用该声明,传递@a将是编译器将找到并禁止的错误.你会转而通过a^,或者你甚至可以完全摆脱指针而只是声明a为平原Single而不是PSingle.
仅仅因为原始代码是用C和C风格的C++编写的,并不意味着你的Delphi代码必须看起来像它.