gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:45 57 4
gpt4 key购买 nike

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

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

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com