我正在使用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?
来避免此错误答案 0 :(得分:3)
对C ++或VS使用av_get_time_base_q()
而不是AV_TIME_BASE_Q
。
This was fixed in a patch
答案 1 :(得分:2)
VC ++ 2013不允许在C ++中使用复合文字,但它允许使用C语言。选项:
如果您希望保留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);