【问题标题】:SBRM/RAII for std::va_list/va_start()/va_end use用于 std::va_list/va_start()/va_end 的 SBRM/RAII
【发布时间】:2012-08-21 22:19:22
【问题描述】:

我的代码包含如下 sn-ps:

    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 保护实例?

【问题讨论】:

    标签: c++ raii variadic-functions


    【解决方案1】:

    很遗憾,没有。 va_startva_end 的规范要求:

    va_startva_copy 宏的每次调用 应与va_end的相应调用相匹配 功能

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

    【讨论】:

    • @wilx:C99 标准,7.15.1/1。
    【解决方案2】:

    一种可能的实现假设 std::va_list = char* 和 va_end() 只是将该指针设置为空。当然,它可以在函数之外调用。但我不确定它是否会在其他平台上类似地工作。

    最好用一个类来包装这个函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 2023-02-13
      • 2012-08-20
      • 1970-01-01
      • 2020-08-19
      • 2018-08-07
      相关资源
      最近更新 更多