为什么对非指针结构进行类型转换会导致语法错误

3

我正在使用Visual C++ Express 2008尝试编译类似以下代码的内容:

没有问题。

{
  ...
  AVRational test = {1, 1000};
  ...
}

但是,当它是以下内容时,就会有问题

{
  ...
  AVRational test = (AVRational){1, 1000};
  ...
}

出现错误:

1>..\..\..\projects\test\xyz.cpp(1139) : error C2059: syntax error : '{'
1>..\..\..\projects\test\xyz.cpp(1139) : error C2143: syntax error : missing   ';' before '{'
1>..\..\..\projects\test\xyz.cpp(1139) : error C2143: syntax error : missing ';' before '}'

AVRational(ffmpeg.org库)的定义如下:

typedef struct AVRational{
    int num; ///< numerator
    int den; ///< denominator
} AVRational;

FFmpeg带有一些预定义值,例如

#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}

以下是使用方法:

av_rescale_q(seek_target, AV_TIME_BASE_Q, pFormatCtx->streams[stream_index]->time_base);

在Visual C++ Express 2008上编译失败。

看起来相同的代码在gcc编译器上可以编译而无错误/警告。为什么我在VC++上会得到这个错误?在结构值上进行转换是C/C++标准的方式吗?有没有办法避免这个错误,同时仍然能够使用定义的AV_TIME_BASE_Q?


尝试用括号 ( ) 包围你的 { } … 我在其他情况下见过这种方法奏效。 - HypnoToad
你的意思是要做类似这样的操作么:“av_rescale_q(seek_target, (AV_TIME_BASE_Q), pFormatCtx->streams[stream_index]->time_base);”?但它并没有起作用,出现了类似的错误。 - Sany Liew
6
AVRational test = (AVRational){1, 1000}; 不是有效的 C++ 代码。这是 C99 的一个特性,称为“复合字面量”,gcc 将其作为扩展支持。 - Brian Bi
在快速查看ffmpeg.org网站后,它声称是平台无关的,那么使用的是哪个FFmpeg版本? - CPlusPlus OOA and D
1
有关可能的修复,请查看https://dev59.com/Z1DTa4cB1Zd3GeqPNfPP - cup
显示剩余3条评论
3个回答

7

3

VC++ 2013不允许在C ++中使用复合文字,但可以在C中使用。选项:

  1. 将您的程序重命名为.c后缀
  2. 为无法编译的程序打开/TC标志。

如果想继续使用C ++,则另一种选择是更改头文件中AV_TIME_BASE_Q的声明。

static const AVRational AV_TIME_BASE_Q = {1, AV_TIME_BASE};

然后它将使用常量而不是复合字面值。

你是对的。通过鼠标右键单击项目 -> 属性 -> 配置属性 -> C/C++ -> 高级 -> 编译为 -> 使用 /TC 选项而不是默认选项,然后代码将编译成功。在VC ++ express 2013上实现。谢谢。 - Sany Liew

0

关于C++中的复合字面值错误

错误的写法:

 this->buffer.enqueue((tone_t) { duration, frequency });

正确:

tone_t tone = { duration, frequency };
this->buffer.enqueue(tone);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接