奇怪的枚举名称冲突

时间:2012-12-07 15:55:40

标签: c++ gcc namespaces ffmpeg ogre

我正在编译一个同时使用ffmpeg和Ogre的项目。 现在在Windows上,一切正常。

但是当我想用以下代码行编译文件时:

Ogre::PixelFormat format = Ogre::PF_BYTE_RGBA;

编译器出现以下错误:

error: ‘AVPixelFormat’ is not a member of ‘Ogre’

这在很多方面都很奇怪,因为我不仅使用::指定了Ogre命名空间,而且Ogre中也没有AVPixelFormat。 gcc如何将“PixelFormat”与“AVPixelFormat”混淆?

我怎么能摆脱它?

我喜欢在这里使用int而不是枚举,但是另一个Ogre函数需要格式在Ogre :: PixelFormat中。

2 个答案:

答案 0 :(得分:6)

首先使用gcc -E预处理,然后grep通过查找AVPixelFormatPixelFormat的文件进行预处理。我怀疑你有一个#define或typedef漂浮在一起,你只需要找到这种情况发生的地方,并且预编译的源文件就会显现出来。

答案 1 :(得分:3)

问题在于avutil / pixfmt.h:

#define PixelFormat AVPixelFormat

这可以防止用户在自己的代码中的任何位置使用“PixelFormat”一词,即使在命名空间中也是如此。

这是针对仍在使用旧标识符的旧软件的兼容性攻击。

如果您可以编辑代码,解决方案非常简单。只需添加到C ++代码

#define FF_API_PIX_FMT 0

包括ffmpeg标题之前。

这会禁用pixfmt.h标头中的if:

#if FF_API_PIX_FMT
#define PixelFormat AVPixelFormat
...

来源:https://trac.ffmpeg.org/ticket/4216

P.S。我知道这个问题已经过时了,但不知怎的,我觉得没有解决办法,我需要一个解决方案,所以我加了它。