为啥对非指针结构进行类型转换会给出语法错误
Posted
技术标签:
【中文标题】为啥对非指针结构进行类型转换会给出语法错误【英文标题】:why type casting on non-pointer struct give syntax error为什么对非指针结构进行类型转换会给出语法错误 【发布时间】:2014-04-13 03:49:54 【问题描述】:我正在使用 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?
【问题讨论】:
试着用 ( ) 包围你的 ...我已经看到它在其他情况下也有效。 你的意思是做这样的事情“av_rescale_q(seek_target, (AV_TIME_BASE_Q), pFormatCtx->streams[stream_index]->time_base);”?也不工作。出现类似的错误。AVRational test = (AVRational)1, 1000;
不是有效的 C++。这是一个 C99 特性,称为“复合文字”,gcc 支持它作为扩展。
在快速浏览了 ffmpeg.org 网站后,它说它是独立于平台的,现在使用的是什么 FFmpeg 版本?
有关可能的修复,请查看***.com/questions/3869963/compound-literals-in-msvc
【参考方案1】:
在 C++ 或 VS 中使用 av_get_time_base_q()
而不是 AV_TIME_BASE_Q
。
This was fixed in a patch
【讨论】:
【参考方案2】:VC++ 2013 不允许在 C++ 中使用复合文字,但在 C 中允许使用复合文字。选项:
-
使用 .c 后缀重命名您的程序
为无法编译的程序打开 /TC 标志。
如果您希望保留 C++,另一种选择是更改头文件中 AV_TIME_BASE_Q 的声明
static const AVRational AV_TIME_BASE_Q = 1, AV_TIME_BASE;
然后它将使用常量而不是复合文字。
【讨论】:
你是对的。右击项目->属性->配置属性->C/C++->高级->编译为->使用/TC选项代替默认选项,则代码编译成功。 2013 年在 VC++ express 上做过。谢谢。【参考方案3】:对于 C++ 中的复合文字错误
错误:
this->buffer.enqueue((tone_t) duration, frequency );
正确:
tone_t tone = duration, frequency ;
this->buffer.enqueue(tone);
【讨论】:
以上是关于为啥对非指针结构进行类型转换会给出语法错误的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我的着色器文件的所有信息都正确读入字符串并且语法正确时,OpenGL会给出语法错误