gpt4 book ai didi

c++ - SBRM/RAII 用于 std::va_list/va_start()/va_end 使用

转载 作者:可可西里 更新时间:2023-11-01 18:29:37 35 4
gpt4 key购买 nike

我的代码包含如下片段:

    std::va_list ap;
va_start(ap, msgfmt);
snprintf_buf buf;
const tchar * msg = buf.print_va_list(msgfmt, ap);
va_end(ap);

它们很短,va_start()va_end() 靠得很近,所以它们不是什么大问题。两者之间的调用异常可能是一个问题(或不是?)。

简单测试表明,不允许从没有省略号的函数中调用 va_start()。从与 va_start() 不同的函数调用 va_end() 是否允许?

基本上,我很好奇是否可以对这些调用使用 SBRM/RAII 习惯用法,即使必须手动调用 va_start() 然后传递 的实例std::va_list 进入我的 RAII/SBRM 保护实例?

最佳答案

不幸的是,没有。 va_startva_end 的规范要求:

Each invocation of the va_start and va_copy macros shall be matched by a corresponding invocation of the va_end macro in the same function.

因此,va_end 必须在可变参数函数本身中,而不是类析构函数中。

关于c++ - SBRM/RAII 用于 std::va_list/va_start()/va_end 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12141795/

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