【发布时间】:2018-06-11 19:36:15
【问题描述】:
我正在使用 MFC CString 对象作为字符串。我遇到了一个问题,即设置 CString 会导致 GetLastError() 被意外设置为某个值。
以下是问题的简化版本:
CString csTest;
DWORD dwLastError = 0;
SetLastError(0);
csTest = _T("test");
dwLastError = GetLastError(); // dwLastError is still 0, as expected
csTest = "another test"; // Not using TCHAR
dwLastError = GetLastError(); // dwLastError now set to 122, "The data area passed to a system call is too small."
我可以使用 Visual Studio 2015 重现此问题,创建一个全新的 MFC 项目(基于对话框),并将此代码添加到它创建的对话框的 OnInitDialog() 函数中。
我知道第一个字符串是TCHAR,在此项目中默认为WCHAR。因此,char* 的 CString 赋值运算符似乎导致了问题。
有没有办法解决这个问题?一种获取编译器警告以通知我char* 分配而不是WCHAR* 的方法?我认为它曾经在 Visual Studio 的某些早期版本中为此提供警告/错误,但现在似乎没有,所以也许我记错了。
【问题讨论】:
-
任何api函数调用都可以改变
GetLastError的值。有什么问题? -
GetLastError()与其他语言中的类似机制不同,它不是针对代码中每个潜在错误的包罗万象的函数。 @IInspectable 在下面的答案中更详细地介绍了他们的答案,但基本上你应该只在文档说你应该使用它时以及在你正在检查它之后立即使用它时使用GetLastError()作为验证机制。其他任何东西,并且您在 C++ 中没有正确使用它。