在容易出现异常的代码中使用 va_list 是否安全?

2024-04-14

典型例子:

void foo(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);

    // might throw, might not.  who knows.
    bar(fmt, args);

    // uh-oh...
    va_end(args);
}

这是一个坏主意吗?即它不常见吗?va_list在c++中?如果我包裹bar在 try-catch 中,这有帮助吗?有哪些替代方案?


C++ 标准遵循 C 标准的规范va_start等人。 C 标准是这么说的:

7.15.1p1 ...va_start 和 va_copy 宏的每次调用都应与同一函数中 va_end 宏的相应调用相匹配。

因此,如果您在调用后以任何方式退出该函数va_start但之前va_end,您的程序表现出未定义的行为。

是的,包裹bar in a try/catch有助于。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在容易出现异常的代码中使用 va_list 是否安全? 的相关文章

随机推荐