6

嗨,我正在使用 xcode 编译 ffmpeg,我相信它使用 clang 进行编译。在 ffmpeg 中有一个带有名为“class”的成员变量的结构,我相信这在 C 中非常好,但 clang 正试图将其解析为关键字。知道如何解决吗?基本上cpp文件中的以下内容会导致错误:

extern C {
    typedef struct {
        int class;
    } SomeStruct;
}

它试图将类解释为关键字。

仅供参考,在 ffmpeg 中引发错误的文件是 libavcodec/mpegvideo.h,我需要包含它才能访问 MpegEncContext 结构以提取运动图信息。

编辑

上面的代码示例只是为了演示错误。但也许它可以通过另一种方式修复。在我的实际代码中,我有这样的:

#ifdef __cplusplus
extern "C" {
#endif

    #include "libavcodec/mpegvideo.h"
    #include "libavformat/avformat.h"

#if __cplusplus
} //Extern C
#endif

我如何才能将这两个文件包含为 C 文件而不是 C++?

谢谢

4

3 回答 3

6

在 C 中完全没问题。当您将其构建为 C++ 时,您会遇到错误,因为class是 C++ 关键字。

至于修复它,您通常会选择除class. 但是,ffmpeg 开发人员可能不太同意这种变化。因此,您可能需要:

  • 将该标题的可见性限制为 C 翻译
  • 或编辑您自己的副本以便在 C++ 翻译中使用它

幸运的是,在这种情况下,您还使用了对 C99 特性有良好支持的 C 编译器。不能很好地支持 C99 的 C 编译器对于 ffmpeg 源代码特别麻烦(因为您随后会将整个程序编译为 C++ 以获得 C99 功能,并且冲突计数会高得多)。

(您可以采取其他肮脏的技巧来尝试解决该问题,但我不会提及它们)

于 2012-09-21T15:20:19.940 回答
4

基本上cpp文件中的以下内容会导致错误

.cpp 文件作为 C++ 文件处理,而不是 C,并且class是 C++ 中的保留字。

于 2012-09-21T15:16:19.720 回答
2

如果您无法选择重命名这些头文件中的任何内容,则可以将class令牌替换为其他内容

#ifdef __cplusplus
extern "C" {
# define class videoClass
#endif

    #include "libavcodec/mpegvideo.h"
    #include "libavformat/avformat.h"

#if __cplusplus
# undef class
} //Extern C
#endif

这是一个相当肮脏的 hack,但是对于这样糟糕的接口代码,你没有太多选择。真正的解决方案是让struct这些文件中的所有成员都使用带有某种前缀的名称,就像在网络层代码中所做的那样。所有成员都有一些前缀为ss_sa_,这样的问题不太可能发生。

于 2012-09-21T15:38:07.767 回答