Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clang C编译器';类别';保留关键字?_C_Xcode_Ffmpeg_Clang - Fatal编程技术网

Clang C编译器';类别';保留关键字?

Clang C编译器';类别';保留关键字?,c,xcode,ffmpeg,clang,C,Xcode,Ffmpeg,Clang,您好,我正在使用xcode编译ffmpeg,我相信它使用了clang进行编译。在ffmpeg中有一个名为“class”的成员变量的结构,我相信这在C中是很好的,但clang试图将其作为关键字进行解析。知道怎么修理吗?基本上,cpp文件中的以下内容将导致错误: extern C { typedef struct { int class; } SomeStruct; } 它试图将类解释为关键字 仅供参考,在ffmpeg中引发错误的文件是libavcodec/mpeg

您好,我正在使用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++?< /p> 谢谢

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


文件是以C++文件处理的,而不是C,而类< /C>是C++中的保留字。

< P> C.完全是好的,当你把它建成C++时,你会遇到一个错误,因为<代码>类< /C>是C++关键字。 就修复它而言,您通常会选择除
class
之外的标识符。然而,ffmpeg开发人员可能不太同意这种改变。因此,您可能需要:

  • 将该标题的可见性限制为C翻译
  • < >或者编辑自己的副本,以便在C++翻译中使用它
幸运的是,您还使用了一个C编译器,它在本例中很好地支持C99特性。不支持C99的C编译器对FFMPEG源来说特别麻烦(因为你会将整个程序编译为C++的C99特性,冲突计数会高得多)。
(您可以尝试使用其他肮脏的技巧来解决此问题,但我不会提及它们)

如果您没有选择重命名这些头文件中的任何内容,您可以用其他内容替换
标记

#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_
,这样的问题不太可能发生。

但是外部C不应该强制它使用C编译器吗?@user1689196,绝对不会。这只会改变符号的链接以停止名称混乱。您可以通过使用-x标志强制使用该语言。不,
extern C
只是更改名称篡改的工作方式。要编译为C,请使用.cHmm,那么您通常是如何做到这一点的。实际上,我只是包含ffmpeg头文件,而不是实际声明结构内联。USE1689196:你编写C函数来处理FFMPEG代码,然后在C++中声明和调用这些代码,而不包括C++源代码中实际的FFPEG头。XHCODE-(FFMPEG)相关问题是:HeH::代码>外部COBOL {添加A到B,给出C} /COD> >我的XCODEFFMPEG相关问题是,如何将该头文件包含到C++文件中并在XCODEL中编译它?在C++中没有使用这种声明的方法。您需要对源进行重新编译(到处都是成员),或者在C中用一个不与C++冲突的可视接口编写包装器。你可能会也可能不会用宏玩一些把戏(我不熟悉这些源代码,所以我不确定这些宏把戏是否容易实现)。你能再解释一下如何将这些头的可见性限制为C翻译吗?我想我可以将使用该文件的任何代码移到.c文件中。但是我仍然必须在某个点从C++文件中包含.c文件。我想我可以把类变量重命名为其他任何东西,因为它只使用头文件作为参考(FFMPEG已经编译成一个库),但是如果不需要,我就不喜欢干扰源文件。使更新更困难。@user1689196当然。你在正确的轨道上;你需要创建一个薄薄的包装层(C),然后你可以从C++调用它来与<代码> >结构< /COD>交互,或者只处理程序的这个方面,它包含了一个更大的C实现。和维护,但是。。。你只需要选择你认为较小的邪恶(除非有人提出更好的解决方案)。第一种选择更安全,但需要更多的前期工作。随着时间的推移,第二种方法需要更多的维护,并且通常更容易引入错误。当然,您可能只想在每个稳定的版本中获取干净的签出,然后编辑它(每隔几个月就扔掉您的更改)。这一点都不好玩:)这是我在回答中提到肮脏伎俩时想到的最主要的肮脏伎俩:)(别担心,我不会投反对票,因为你确实费了好大劲指出并解释了问题,并明确表示这是肮脏的)