2

不管它的使用有什么潜在的缺陷,我在一个 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[]数组,并将其堆栈地址作为 a 传递char*av_make_error_string().

这是 C99 语法。

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

4

1 回答 1

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<>(). 如果要初始化它,请删除构造函数。当然, boost::array 也可以

av_make_error_string(
    (boost::array<char, AV_ERROR_MAX_STRING_SIZE>().c_array(), 
     AV_ERROR_MAX_STRING_SIZE, 
     errnum)
于 2013-06-26T20:58:19.057 回答