最近,我已经将大量的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
在示例中,插入了错误的
@
。程序不会崩溃,仅处理该错误数据并保持运行。我需要一种找到传递“指向值的指针”而不是“指向值的指针”的情况的方法。您如何跟踪此类指针错误?
最佳答案
“类型化@运算符”编译器选项旨在准确检测此类错误。禁用后,表达式@a
的类型为Pointer
,与所有指针类型兼容。启用该选项,并且同一表达式的类型为^PSingle
,它与预期的PSingle
不兼容。
我建议在所有项目中都启用该选项。让我感到困惑的是,Delphi一直没有将该选项设置为默认选项。
您可以使用$T+
和$T-
编译器指令在代码中修改该选项的状态。
您可以做的另一件事是将代码转换为使用更惯用的Delphi。例如,通过引用而不是指针值传递参数。更改参数的定义:
procedure someFunc(var arg: Single);
使用该声明,传递
@a
将是编译器将发现并禁止的错误。您可以改为传递a^
,或者甚至可以完全摆脱指针,而只需将a
声明为普通的Single
而不是PSingle
。仅仅因为原始代码是用C和C风格的C ++编写的,并不意味着您的Delphi代码必须看起来像它。
关于delphi - 如何跟踪双指针使用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27602515/