不管它的使用有任何潜在的陷阱,我在其中一个 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/