C++ 处理C+中的无效参数异常+;
我用CLI C++编写了以下代码:C++ 处理C+中的无效参数异常+;,c++,linux,porting,C++,Linux,Porting,我用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(fun
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无效参数处理程序。这些都没有在标准C++中支持(它们是微软特有的)。
我试图让这个代码兼容Linux,所以我在STL C++中重新编译它。
为了实现这一点,我将uuu try,uuuu except(1)改为try,catch(…),我希望在参数无效的情况下也能使用它(尽管我无法获得有关异常类型的信息vsnprintf_s抛出)。它是等效代码吗
至于_set_invalid_parameter_handler,我不知道如何在Linux中复制这个机制。我知道如何使用信号,但我找不到在向函数传递无效参数时触发的信号 C++中没有无效的参数。只有未定义的行为。这是Microsoft在做一些底层实现特定的工作。如果不编写一堆代码,就不可能在其他地方复制它<代码> VSNPROTFFS 只在标准C++中略微存在,所以要警告。它可能无法实施。您需要实现并安装执行行为、抛出异常的。你可能还需要定义例外。我从来没有这样做过,所以如果不做很多我现在没有时间做的工作,我就不能给出权威的答案。一旦你解决了这个问题,并有一个工作解决方案,这将是一个精彩的自我回答问题。但是最后一点,如果你编写标准兼容的C++和使用IoSokes,你就不会有任何这些问题。这仍然可以在CLI中执行,并将消除几乎所有的可移植性问题。@user4581301使用iostreams是什么意思?如何用iostreams替换vsnprintf_的功能?另外-这段代码不知何故检测到不正确的参数并使用该信息设置标志-我如何通过使用iostreams克服这样做的需要?谢谢