大佬教程收集整理的这篇文章主要介绍了delphi – E2010不兼容的类型,为什么?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
[DCC Error] JwaStrSafe.pas(2277): E2010 Incompatible types: 'PSTRSAFE_LPWSTR' and 'PSTRSAFE_LPTSTR'
以下是来自JwaStrSafe.pas(来自jedi Api)的代码的相关部分,我正在使用UNICODE定义的符号进行编译:
type STRSAFE_LPWSTR = PWIDECHAR; PSTRSAFE_LPWSTR = ^STRSAFE_LPWSTR; {$IFDEF UNICODE} STRSAFE_LPTSTR = STRSAFE_LPWSTR; PSTRSAFE_LPTSTR = ^STRSAFE_LPTSTR; {$ELSE} ... {$ENDIF} ... //function declaration function StringCchCopyExW( {__out_ecount(cchDest)}pszDest : STRSAFE_LPWSTR; {__in}cchDest : size_t; {__in}const pszSrc : STRSAFE_LPCWSTR; {__deref_opt_out_ecount(pcchRemaining^)}ppszDestEnd : PSTRSAFE_LPWSTR; {__out_opt}pcchRemaining : PSize_t; {__in}dwFlags : Cardinal) : HRESULT; stdcall; forWARD; external; ... //var passed to function ppszDestEnd : PSTRSAFE_LPTSTR; ... {$IFDEF UNICODE} result := StringCchCopyExW(pszDest,cchDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); {$ELSE} result := StringCchCopyExA(pszDest,dwFlags); {$ENDIF}
我在参数ppszDestEnd上调用StringCchCopyExW时出错.
查看类型定义我明白PSTRSAFE_LPTSTR是STRSAFE_LPTSTR的指针类型,它只是STRSAFE_LPWSTR的别名,为什么PSTRSAFE_LPTSTR和PSTRSAFE_LPWSTR不兼容?
解
感谢大卫的解释我取代了
PSTRSAFE_LPTSTR = ^STRSAFE_LPTSTR;
同
PSTRSAFE_LPTSTR = PSTRSAFE_LPWSTR;
现在代码编译没有错误.
谢谢
program PointerTypeCompatibility; {$APPTYPE CONSOLE} type A = Integer; B = Integer; var ptA: ^A; ptB: ^B; begin ptA := ptB; end.
这也产生了E2010.但是,如果启用type-checked pointers选项,则代码将成功编译.实际上,该编译器选项的文档指出:
感谢Ken White为我指出了有用的帮助主题Type Compatibility and Identity.相关的摘录是T1和T2类型在以下情况下是分配兼容的:
文档还指出类型是类型兼容的,如果:
所以这记录了观察到的行为并引导我到这个例子:
program PointerTypeCompatibilityTake2; {$APPTYPE CONSOLE} {$TYPEDADDRESS OFF} var P1,P2: ^Integer; P3: ^Integer; begin P1 := P2;//compiles P1 := P3;//E2008 Incompatible types end.
所以,总结一下:
>当禁用类型检查指针时,如果指针属于同一类型,则指针是赋值兼容的.
>当启用类型检查指针时,如果指针指向相同类型,则指针是赋值兼容的.
以上是大佬教程为你收集整理的delphi – E2010不兼容的类型,为什么?全部内容,希望文章能够帮你解决delphi – E2010不兼容的类型,为什么?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。