【问题标题】:Strange enum name clash奇怪的枚举名称冲突
【发布时间】:2012-12-07 15:55:39
【问题描述】:

我正在编译一个同时使用 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。

【问题讨论】:

  • 我猜PixelFormat 在某处被定义为宏。

标签: c++ gcc namespaces ffmpeg ogre


【解决方案1】:

首先使用gcc -E对其进行预处理,然后通过grep通过文件查找AVPixelFormatPixelFormat对其进行预处理。我怀疑您有 #define 或 typedef 浮动,您只需要找到发生这种情况的位置,而预编译的源文件就是这会变得明显的地方。

【讨论】:

  • 啊,是的。来自 ffmpeg 的 pixfmt.h 有一个将 AVPixelFormat 定义为 PixelFormat 的宏。 ffmpeg 开发人员有点鲁莽的另一个证据;)
  • @TheSHEEEP:我想说一个宏应该死的证明......(顺便说一句,你应该接受这个答案)。
  • @djechlin:据我所知,typedef 不会引发这样的问题。
  • 很抱歉接受晚了,收到答案后不得不直接离开办公室:) 我不会说宏应该死。如果使用得当,它们会很有用。就像.. 不命名没有命名空间的 PixelFormat ;)
【解决方案2】:

问题出在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

附:我知道这个问题很老了,但不知何故我觉得没有解决方案,我需要一个解决方案,所以我添加了它。

【讨论】:

  • 嗨,本,stackoverflow.com/review/suggested-edits/13669700 上的编辑是否是元讨论的一部分?如果没有,让我们创建讨论并立即进行所有讨论。然后它应该由具有 3k+ 代表的人来完成,以免产生太多的编辑。干杯。
  • 嗨,是的,这是我的想法,因为它是一个非常不幸地选择的标签。 bullet-physics 更合适,很多人为与射弹和子弹点相关的东西添加子弹。标签应该消失了,我想我会全部编辑它们(这也给了我很好的声誉:))。我很想自己做批量更改,但我缺乏声誉。在我们烧掉标签之前,我最好清理那些与子弹物理无关的东西(主要与射弹和子弹点有关),这是我为其中几个所做的另一个编辑。让我们讨论一下。
猜你喜欢
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
相关资源
最近更新 更多