如何在C++ Builder中调试PAS文件?(E2468不允许void类型值)
解决C++ Builder中调试Delphi代码时无法查看Pascal字符串变量的问题
你遇到的是跨语言调试里典型的字符串类型识别问题——C++ Builder调试器对Delphi的string别名类型解析出现了混淆,才会弹出E2468 Value of type void is not allowed的错误。下面是几个实测有效的解决思路:
1. 显式指定字符串类型(推荐)
Delphi里的string是个版本依赖的别名,在不同环境下可能对应AnsiString或UnicodeString,这种模糊性会让跨语言调试器"摸不清头脑"。直接把函数里的string替换成明确的类型:
function EnterToCRLF (CONST Text: UnicodeString): UnicodeString; begin Result:= StringReplace(Text , CR, 'CR', [rfReplaceAll]); Result:= StringReplace(Result, LF, 'LF', [rfReplaceAll]); end;
重新编译Delphi代码后,调试器就能正确识别变量类型,直接查看Text和Result的值。
2. 在监视窗口手动强制类型转换
如果不想修改代码,可以在监视列表里给变量加上类型转换,主动告诉调试器正确的类型:
- 查看
Text时输入:UnicodeString(Text) - 查看
Result时输入:UnicodeString(Result)
这样调试器就能解析出字符串内容,不会再报void类型错误。
3. 验证调试符号的完整性
虽然你说已经配置了Delphi调试设置,但还是要再核对两点:
- Delphi项目的Delphi Compiler -> Debugging选项里,确保勾选了
Debug information和Local symbols,并且调试信息格式(比如DWARF或TD32)和C++项目完全一致。 - C++项目的Linker -> Debugging选项里,启用
Generate debug information,并选择和Delphi项目匹配的格式。
4. 清理重建整个项目
旧的调试符号缓存经常会引发这类奇怪的问题:
- 删除Delphi项目的
.dcu文件、C++项目的.obj和.tds文件 - 先重新编译Delphi代码,再编译C++项目,确保生成全新的调试符号文件
问题根源说明
C++和Delphi的字符串类型底层存储结构差异很大,跨语言调试时,如果调试器无法自动映射Delphi的string别名到具体的字符串类型,就会把它识别为void类型,自然无法读取变量值。通过显式类型声明或强制转换,就能帮调试器理清类型关系。
内容的提问来源于stack exchange,提问作者Error - CPU Not Foud
相关产品推荐
相关产品推荐

