Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 处理C+中的无效参数异常+;_C++_Linux_Porting - Fatal编程技术网

C++ 处理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

我用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无效参数处理程序。这些都没有在标准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克服这样做的需要?谢谢