为什么在非指针结构上进行类型转换会产生语法错误

时间:2014-04-13 03:49:54

标签: c++ c visual-c++ ffmpeg

我正在使用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?

来避免此错误

3 个答案:

答案 0 :(得分:3)

对C ++或VS使用av_get_time_base_q()而不是AV_TIME_BASE_QThis was fixed in a patch

答案 1 :(得分:2)

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

  1. 使用.c后缀
  2. 重命名程序
  3. 为未编译的程序打开/ TC标志。
  4. 如果您希望保留C ++,另一种选择是更改头文件中AV_TIME_BASE_Q的声明

    static const AVRational AV_TIME_BASE_Q = {1, AV_TIME_BASE};
    

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

答案 2 :(得分:0)

对于C ++中的复合文字错误

错误:

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

正确:

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