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

2つのファイルをC++ではなくCファイルとして含めるにはどうすればよいですか?

ありがとう

4

3 に答える 3

6

Cではまったく問題ありません。C++としてビルドするとclass、C ++キーワードであるため、エラーが発生します。

それを修正する限り、通常は。以外の識別子を選択しますclass。ただし、ffmpegの開発者はその変更にそれほど同意できないかもしれません。したがって、次のいずれかが必要になる場合があります。

  • そのヘッダーの可視性をC翻訳に制限します
  • または、C++翻訳で使用するために独自のコピーを編集します

幸い、この場合、C99機能を適切にサポートするCコンパイラも使用しています。C99を十分にサポートしていないCコンパイラは、ffmpegソースで特に厄介です(C99機能用にプログラム全体をC ++としてコンパイルすると、競合の数がはるかに多くなるため)。

(問題を回避するためにできる他の汚いトリックがありますが、私はそれらについては言及しません)

于 2012-09-21T15:20:19.940 に答える
4

基本的に、cppファイルで次のようにするとエラーが発生します

.cppファイルはCではなくC++ファイルとして処理され、C++ではclass予約語です。

于 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

これはかなり汚いハックですが、そのようなひどくインターフェースされたコードについては、多くの選択肢がありません。実際の解決策は、これらのファイルのすべてのstructメンバーに、ネットワーク層コードで行われているように、ある種のプレフィックスなどの名前を使用させることです。すべてのメンバーにまたはとしていくつかのプレフィックスがありss_sa_そのような問題が発生する可能性はほとんどありません。

于 2012-09-21T15:38:07.767 に答える