Clang C编译器'class'关键字保留?

时间:2012-09-21 15:14:48

标签: c xcode ffmpeg clang

您好我正在使用xcode编译ffmpeg,我相信使用clang进行编译。在ffmpeg中有一个带有名为'class'的成员变量的结构。我相信这在C中完全没问题,但clang试图将其解析为关键字。知道怎么解决?基本上cpp文件中的以下内容会导致错误:

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

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

FYI在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 ++?

由于

3 个答案:

答案 0 :(得分:5)

在C中完全没问题。当你用C ++构建它时,会遇到错误,因为class是一个C ++关键字。

就修复它而言,通常会选择class以外的标识符。然而,ffmpeg开发人员可能不会对这种变化如此满意。因此,您可能需要:

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

幸运的是,您也在使用C编译器,在这种情况下,它对C99功能有很好的支持。 C不能很好地支持C99的编译器对于ffmpeg源特别麻烦(因为你可以将整个程序编译为C ++用于C99功能,并且冲突计数会更高)。

还有可以尝试解决问题的其他肮脏技巧,但我不会提及它们)

答案 1 :(得分:4)

  

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

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

答案 2 :(得分:1)

如果您没有选择重命名这些头文件中的任何内容,则只需用其他内容替换class令牌

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

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

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

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