gpt4 book ai didi

c++ - 使用 GetLastError() 的真正正确方法(时间)是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 23:51:08 24 4
gpt4 key购买 nike

在 Stack Overflow 上的一个扩展争论之后(现在已经被 Powers-that-Be 清理),出现了一个问题,即什么时候应该真的 调用 GetLastError 函数。

注意:这不是关于风格的问题,只是关于: (a) 在“非纯粹”代码的情况下,标准保证(或不保证)什么; (b) 在安全 winapi 编程方面,“最佳实践”是什么。

这是一个示例(改编自那里发布的原始问题):

#include <windows.h>
#include <stdio.h>
#include <iostream>

//#define PURIST 1

using namespace std;
int main()
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SMALL_RECT wSize = { 0,0,60,20 }; // Works on my screen!
if (hConsole == nullptr) {
cout << "Console Handle is Null" << endl;
return 1;
}
else {
char message[256];
if (!SetConsoleWindowInfo(hConsole, TRUE, &wSize)) {
#ifdef PURIST
// 'Purist' code ...
DWORD eCode = GetLastError();
sprintf(message, "SetConsoleWindowInfo failed; code = %d!", eCode);
#else
// More normal code ...
sprintf(message, "SetConsoleWindowInfo failed; code = %d!", GetLastError());
#endif
}
else {
strcpy(message, "SetConsoleWindowInfo call succeeded!");
}
cout << message << endl;
}
getchar(); // Just to stop console closing!
return 0;
}

显然,“纯粹主义”方法总是会正常工作!但是,c++ 语言标准是否保证“正常”方法也有效? (也就是说,可以确定 GetLastError() 作为 sprintf 的参数将是在测试 SetConsoleWindowInfo() 的返回值后执行的第一个代码 ?)

PS:请不要对我的代码质量评价太苛刻!正如我所说,这是对原始问题的改编。

编辑:更典型的情况(我在我的 Windows 应用程序中经常使用)如下所示:

if (<WinApi call failed>) {
TCHAR eText[256];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, GetLastError(), 0, eText, 255, nullptr);
// Do something with eText, etc. ...
return <error code>;
}

但是,GetLastError() 是唯一的非常量参数。

最佳答案

我将把这个问题分成两个独立的问题:

  1. “正常代码”示例是否按预期工作?
    是的,这个确切的代码将按预期工作。其他函数参数是内置类型,即使未定义顺序函数参数的评估,它们也不会干扰 GetLastError 调用。
  2. “普通代码”示例是调用 GetLastError 的正确方法吗?
    它不是,即使运行此代码会产生预期的结果。其原因是 使用 GetLastError 作为函数参数引入了对其他函数参数的隐式约束,它们必须没有最后错误更改的副作用。这使得代码更容易出错并且更难维护。

因此经验法则是在调用其他函数或创建/销毁对象之前将最后一个错误值存储在某个变量中。

关于c++ - 使用 GetLastError() 的真正正确方法(时间)是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57760080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com