无论使用它的任何潜在缺陷,我都在其中一个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吗?
答案 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}}