C++ 我可以在函数的第一行启动'GetLastError'吗?

C++ 我可以在函数的第一行启动'GetLastError'吗?,c++,winapi,C++,Winapi,我知道发生错误时,将立即调用GetLastError。我编写了函数: void PrintErrorMsg() { DWORD errCode = GetLastError(); LPTSTR msg = NULL; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL,

我知道发生错误时,将立即调用
GetLastError
。我编写了函数:

void PrintErrorMsg() {
    DWORD errCode = GetLastError();
    LPTSTR msg = NULL;
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL, errCode, 0, (LPTSTR)&msg, 0, NULL);
    wcerr << msg << endl;
    HeapFree(GetProcessHeap(), 0, msg);
}

因此,我在
PrintErrorMsg
函数的第一行代码中调用了
GetLastError
。这种使用变体是否可以接受?

那代码就可以了。在
CreateBoundaryDescriptor
返回和调用
GetLastError

该代码之间没有调用Windows API函数。在
CreateBoundaryDescriptor
返回和调用
GetLastError

该代码之间没有调用Windows API函数。在
CreateBoundaryDescriptor
返回和调用
GetLastError

该代码之间没有调用Windows API函数。在
CreateBoundaryDescriptor
返回和您对
GetLastError
的调用之间不调用Windows API函数是的,这是允许的。我也做了类似的事情,只是将错误代码作为参数传入,但将参数的默认值作为
GetLastError()
的结果,如下所示:

// in header file
void PrintErrorMsg( DWORD errCode = GetLastError() );


// in implementation file
void PrintErrorMsg( DWORD errCode  )
{
   // ...
}
std::cout << "Win32 function failed with error: " << GetLastError() << std::endl;

它更灵活,对我来说效果很好。

是的,这是允许的。我也做了类似的事情,只是将错误代码作为参数传入,但将参数的默认值作为
GetLastError()
的结果,如下所示:

// in header file
void PrintErrorMsg( DWORD errCode = GetLastError() );


// in implementation file
void PrintErrorMsg( DWORD errCode  )
{
   // ...
}

它更灵活,对我来说效果很好。

是的,这是允许的。我也做了类似的事情,只是将错误代码作为参数传入,但将参数的默认值作为
GetLastError()
的结果,如下所示:

// in header file
void PrintErrorMsg( DWORD errCode = GetLastError() );


// in implementation file
void PrintErrorMsg( DWORD errCode  )
{
   // ...
}

它更灵活,对我来说效果很好。

是的,这是允许的。我也做了类似的事情,只是将错误代码作为参数传入,但将参数的默认值作为
GetLastError()
的结果,如下所示:

// in header file
void PrintErrorMsg( DWORD errCode = GetLastError() );


// in implementation file
void PrintErrorMsg( DWORD errCode  )
{
   // ...
}
它更灵活,对我来说效果很好

调用线程执行的函数通过调用SetLastError函数来设置此值。当函数的返回值指示此类调用将返回有用数据时,应立即调用GetLastError函数。这是因为某些函数在成功调用SetLastError时,会使用零来清除最近失败的函数设置的错误代码

您的代码没有问题,因为您没有调用可能在失败和调用
GetLastError()
之间调用
SetLastError()
的函数(例如Win32 API调用)

请记住,插入运算符可能会调用
SetLastError()

std::cout
调用线程执行的函数通过调用SetLastError函数来设置此值。当函数的返回值指示此类调用将返回有用数据时,应立即调用GetLastError函数。这是因为某些函数在成功调用SetLastError时,会使用零来清除最近失败的函数设置的错误代码

您的代码没有问题,因为您没有调用可能在失败和调用
GetLastError()
之间调用
SetLastError()
的函数(例如Win32 API调用)

请记住,插入运算符可能会调用
SetLastError()

std::cout
调用线程执行的函数通过调用SetLastError函数来设置此值。当函数的返回值指示此类调用将返回有用数据时,应立即调用GetLastError函数。这是因为某些函数在成功调用SetLastError时,会使用零来清除最近失败的函数设置的错误代码

您的代码没有问题,因为您没有调用可能在失败和调用
GetLastError()
之间调用
SetLastError()
的函数(例如Win32 API调用)

请记住,插入运算符可能会调用
SetLastError()

std::cout
调用线程执行的函数通过调用SetLastError函数来设置此值。当函数的返回值指示此类调用将返回有用数据时,应立即调用GetLastError函数。这是因为某些函数在成功调用SetLastError时,会使用零来清除最近失败的函数设置的错误代码

您的代码没有问题,因为您没有调用可能在失败和调用
GetLastError()
之间调用
SetLastError()
的函数(例如Win32 API调用)

请记住,插入运算符可能会调用
SetLastError()


<代码> STD::CUT

我发现处理Win32 API(或任何C风格API)的这些底层细节的最佳方法是,立即将C风格API应用到C++中。我使用的一种方法是在宏中封装C风格的API调用,该宏验证返回值,然后在返回值指示失败时将适当的错误代码提取到异常中

在我的书中,我概述了COM
HRESULT
返回值的这种方法。如果
HRESULT
指示失败,宏
THR
将抛出。在
HRESULT
中,故障状态和错误代码包含在相同的整数值中,因此可以直接从提供的
HRESULT
计算异常。在将要检查的值传递到检查失败的帮助函数之前,宏将使用
\uuuuu FILE\uuuuu
\uuuuuuu LINE\uuuuuuu
装饰其参数。如果检测到故障,所有信息都将收集到异常中,并引发异常。如果
HRESULT
指示成功,则返回
HRESULT

我还为带有
TWS
的Win32 API状态提供了类似的变体。这会进行必要的验证