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

时间:2013-06-26 19:34:20

标签: 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语法。

pre-C ++ 11是否有相同的语法?
这也适用于C ++ 11吗?

1 个答案:

答案 0 :(得分:3)

是的,但是在C ++中,数组的生命周期实际上是 的东西(只是在其周围的表达式语句的持续时间内是活着的,粗略地说)。在您的C99示例中,实际上数组的生命周期将是其周围的块。

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<>()时阻止av_make_error_string( (boost::array<char, AV_ERROR_MAX_STRING_SIZE>().c_array(), AV_ERROR_MAX_STRING_SIZE, errnum) 的零初始化。如果要初始化它,请删除构造函数。当然,boost :: array只是起作用

{{1}}