Clang C编译器';类别';保留关键字?
您好,我正在使用xcode编译ffmpeg,我相信它使用了clang进行编译。在ffmpeg中有一个名为“class”的成员变量的结构,我相信这在C中是很好的,但clang试图将其作为关键字进行解析。知道怎么修理吗?基本上,cpp文件中的以下内容将导致错误: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
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,而
class
之外的标识符。然而,ffmpeg开发人员可能不太同意这种改变。因此,您可能需要:
- 将该标题的可见性限制为C翻译 < >或者编辑自己的副本,以便在C++翻译中使用它
(您可以尝试使用其他肮脏的技巧来解决此问题,但我不会提及它们)如果您没有选择重命名这些头文件中的任何内容,您可以用其他内容替换
类
标记
#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实现。和维护,但是。。。你只需要选择你认为较小的邪恶(除非有人提出更好的解决方案)。第一种选择更安全,但需要更多的前期工作。随着时间的推移,第二种方法需要更多的维护,并且通常更容易引入错误。当然,您可能只想在每个稳定的版本中获取干净的签出,然后编辑它(每隔几个月就扔掉您的更改)。这一点都不好玩:)这是我在回答中提到肮脏伎俩时想到的最主要的肮脏伎俩:)(别担心,我不会投反对票,因为你确实费了好大劲指出并解释了问题,并明确表示这是肮脏的)