Visual Studio 2012中的(char[32]){0}有什么问题吗?

Visual Studio 2012中的(char[32]){0}有什么问题吗?,c,visual-studio,ffmpeg,C,Visual Studio,Ffmpeg,======背景==== 此问题源于在visual studio 2012中使用fFmpeg lib sample muxing.c,我发现了错误: error C2143: Syntax error missing ) before { 在 我发现 #define AV_TS_MAX_STRING_SIZE 32 #define av_ts2str(ts) av_ts_make_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts) 为了消除不相关的语句,

======背景====

此问题源于在visual studio 2012中使用fFmpeg lib sample muxing.c,我发现了错误:

error C2143: Syntax error missing ) before {

我发现

#define AV_TS_MAX_STRING_SIZE 32
#define av_ts2str(ts) av_ts_make_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts)
为了消除不相关的语句,我用

printf("pts:%s \n",
    (char[32]){0}
    );
但错误仍然是一样的,看起来错误来自

(char[32]){0}
===问题====


由于这个示例源文件muxing.c是官方文件(我认为),可能不会出错,所以该语句是否错误或与VS编译器不兼容?或者我在这里遗漏了什么?

对于数组来说,看起来像一组大括号块的构造称为复合文字。这是VisualStudio系列编译器中尚未实现的C99功能之一

不幸的是,没有简单的方法来解决这个问题,因为复合文本创建了一个临时匿名数组,该数组将自动释放。因此,您漂亮的short
printf
将转换为如下内容:

char buf1[AV_TS_MAX_STRING_SIZE] = {0};
av_ts_make_string(buf1, pkt->pts);
char buf2[AV_TS_MAX_STRING_SIZE] = {0};
av_ts_make_string(buf1, pkt->dts);
char buf3[AV_TS_MAX_STRING_SIZE] = {0};
av_ts_make_string(buf1, pkt->duration);

printf("pts:%s pts_time:%s dts:%s dts_time:%s duration:%s duration_time:%s stream_index:%d\n",
    buf1, av_ts2timestr(pkt->pts, time_base),
    buf2, av_ts2timestr(pkt->dts, time_base),
    buf3, av_ts2timestr(pkt->duration, time_base),
    pkt->stream_index);   

除了dasblinkenlight所说的,还有一种方法可以用MSVC编译ffmpeg(可能还有其他使用此结构和其他C99结构的源代码)。一个脚本可以自动地将这个C99代码转换成希望等价的C89代码


有关详细信息,请参阅。

,并建议它依赖C99支持。Visual Studio仅支持C89。您可以使用gcc在Windows上编译(这可能是一个很麻烦的设置),也可以按照上面的链接到一个转换工具,该工具将ffmpeg源代码修改为C89兼容
(char[32]){0}
是一个复合文本。这是C99的一个特点。微软的“C”编译器不支持C99,这很可惜。请尝试使用GCC的MinGW端口编译您的代码。VS2013支持复合文字。@tab我尝试使用visual 2013,但没有成功。
char buf1[AV_TS_MAX_STRING_SIZE] = {0};
av_ts_make_string(buf1, pkt->pts);
char buf2[AV_TS_MAX_STRING_SIZE] = {0};
av_ts_make_string(buf1, pkt->dts);
char buf3[AV_TS_MAX_STRING_SIZE] = {0};
av_ts_make_string(buf1, pkt->duration);

printf("pts:%s pts_time:%s dts:%s dts_time:%s duration:%s duration_time:%s stream_index:%d\n",
    buf1, av_ts2timestr(pkt->pts, time_base),
    buf2, av_ts2timestr(pkt->dts, time_base),
    buf3, av_ts2timestr(pkt->duration, time_base),
    pkt->stream_index);