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

San*_*iew 3 c c++ ffmpeg visual-c++

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

没问题

{
  ...
  AVRational test = {1, 1000};
  ...
}
Run Code Online (Sandbox Code Playgroud)

出现问题如下:

{
  ...
  AVRational test = (AVRational){1, 1000};
  ...
}
Run Code Online (Sandbox Code Playgroud)

给出了错误:

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 '}'
Run Code Online (Sandbox Code Playgroud)

其中 AVRational(ffmpeg.org 库)定义为:

typedef struct AVRational{
    int num; ///< numerator
    int den; ///< denominator
} AVRational;
Run Code Online (Sandbox Code Playgroud)

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

#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}
Run Code Online (Sandbox Code Playgroud)

如下使用

av_rescale_q(seek_target, AV_TIME_BASE_Q, pFormatCtx->streams[stream_index]->time_base);
Run Code Online (Sandbox Code Playgroud)

将无法在 Visual C++ express 2008 上编译

似乎在 gcc 编译器上编译相同的代码时不会出现错误/警告。为什么我在 VC++ 上收到这个错误?它是对结构值进行强制转换的 C/C++ 标准方法吗?无论如何,我可以在仍然能够使用定义的 AV_TIME_BASE_Q 的同时避免这个错误?

小智 7

使用av_get_time_base_q()的,而不是AV_TIME_BASE_Q为C ++或VS. 这是在补丁中修复的