C99 临时局部数组变量的 C++ 版本

标签 c++ c99

不管它的使用有任何潜在的陷阱,我在其中一个 ffmpeg 头文件中找到了这个代码片段:

/**
 * Convenience macro, the return value should be used only directly in
 * function arguments but never stand-alone.
 */
#define av_err2str(errnum) \
    av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum)

我的问题是关于 (char[AV_ERROR_MAX_STRING_SIZE]){0}
它本质上在堆栈上创建一个 char[] 数组,并将其堆栈地址作为 char* 传递,以便由 av_make_error_string() 就地填充>.

这是 C99 语法。

C++11 之前版本是否有等效语法?
这也适用于 C++11 吗?

最佳答案

是的,但在 C++ 中,数组的生命周期实际上是暂时的(粗略地说,仅在其周围表达式语句的持续时间内有效)。在您的 C99 示例中,实际上,数组的生命周期将是其周围的 block 。

template<int I>
struct Array {
  Array() {}
  char data[I];
};

那么你可以说

av_make_error_string(
    (Array<AV_ERROR_MAX_STRING_SIZE>().data, 
     AV_ERROR_MAX_STRING_SIZE, 
     errnum)

用户定义构造函数的唯一目的是防止 data 的零初始化当您执行Array<>()时。如果您想对其进行初始化,请删除构造函数。当然,boost::array 也可以工作

av_make_error_string(
    (boost::array<char, AV_ERROR_MAX_STRING_SIZE>().c_array(), 
     AV_ERROR_MAX_STRING_SIZE, 
     errnum)

关于C99 临时局部数组变量的 C++ 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17328898/

相关文章:

c++ - 为什么我的多文件编译玩具示例无法编译?

c++ - 无法更改位于另一个窗口内的窗口的背景颜色

c++ - 在 C++ 中传递带有参数的函数

c++ - 创建 shared_ptr 到堆栈对象

c - c语言中的右移。

c - 使数组内容易变的正确语法?

c - 具有相同指针的指针运算(数组下标不是整数)

c++ - 有没有办法将模板函数签名作为模板模板参数传递

c - 如何在不取消引用的情况下确定指向数据的大小?

c - 如何修复 C99 中的隐式声明错误?