我有以下用CLI C ++编写的代码:
static void BadTraceHandler(const wchar_t* expression,
const wchar_t* function,
const wchar_t* file,
unsigned int line,
uintptr_t pReserved)
{
UNREFERENCED_PARAMETER(expression);
UNREFERENCED_PARAMETER(function);
UNREFERENCED_PARAMETER(file);
UNREFERENCED_PARAMETER(line);
UNREFERENCED_PARAMETER(pReserved);
sBadTrace = 1;
}
void func ()
{
newHandler = BadTraceHandler;
oldHandler = _set_invalid_parameter_handler(newHandler);
_CrtSetReportMode(_CRT_ASSERT, 0);
sBadTrace = 0;
__try
{
vsnprintf_s((char*)pDisplayStr, MAX_TRACE_LEN, _TRUNCATE, (char*)pTempFormat, (va_list)pList);
}
__except(1)
{
sBadTrace = 1;
}
_set_invalid_parameter_handler(oldHandler);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_WNDW);
}
此代码的目标是在函数vsnprintf_s收到错误参数的情况下将sBadTrace基本设置为1,并且为此目的使用两个机制--__try,__ except(1)和_set_invalid_parameter_handler。标准C ++中不支持这些(它们是Microsoft特定的)。
我正在努力使这个代码与Linux兼容,所以我在STL C ++中重新连接它。 为了实现这一点,我改变了__try,__ except(1)来尝试,捕获(...),我希望在参数无效的情况下也能正常工作(虽然我无法获得有关异常类型的信息vsnprintf_s抛出)。它是等效的代码吗?
至于_set_invalid_parameter_handler - 我不知道如何在Linux中复制这种机制。我知道所有关于使用信号的信息,但是当无效参数传递给函数时,我无法找到触发的信号。