gpt4 book ai didi

c# - 捕获 va_list 错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:03:10 28 4
gpt4 key购买 nike

我目前正在使用以下函数来打印我的调试字符串:

void Script::OutputDebugStringN(const char *format, ...)
{
char outstring[256];
memset(outstring, 0, sizeof(outstring));

try
{
va_list args = {0};
va_start(args, format); //args = (va_list) (&format+1);

vsprintf(outstring, format, args);

va_end(args);

OutputDebugString(outstring);
}
catch (...) //most likely reference val arg error (va_list doesn't support ref args)
{
OutputDebugString("[OutputDebugStringN] Something went wrong\n");
}
}

每次发送引用值参数时,我都会收到“Editor.exe 中出现类型为‘System.AccessViolationException’的未处理异常”错误消息;这是完全可以理解的,但我想知道如何将其封装在一个可能的 try catch 语句中以防止错误关闭我的整个程序。 (上面的不行)

我目前正在从我的 c# 编辑器中调用自制的 c++ dll(具有上述功能)。

这是 C# 代码:

private void ComponentDispatcher_ThreadIdle(object sender, EventArgs e)
{
//render display window (if something is not blocking it)
if (renderViewHost.Update)
{
try { NativeMethods.UpdateRenderWindow(); }
catch (Exception exc)
{ Debug.WriteLine("[ThreadIdle::UpdateRenderWindow] Exception caught: {0}" + exc); }
}
}

我只是觉得打印调试字符串的函数本身有错误是 Not Acceptable 。有任何想法吗?欢迎所有关于错误代码/观察的评论。

最佳答案

根据 C++ 标准,使用 va_start 传递引用参数是 C++ 中的未定义行为。这意味着您无法预测编译器将做什么。即使某些东西在这个编译器中工作,它也可能在另一个编译器上不起作用。它甚至可能不适用于同一编译器的下一个版本。

也就是说,可能有特定于平台的构造可以帮助您引发异常。例如。在 Windows 上,您应该能够使用 _try/_except捕捉异常。但请注意,这是未定义的行为——即使它在这个版本的编译器中工作,在下一个版本中,va_start 可能会决定做一些完全不同的事情,这可能会导致其他错误,而不是可以在 __try/__except

关于c# - 捕获 va_list 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13318161/

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