2012-09-21 77 views
5

Hola, estoy compilando ffmpeg utilizando xcode, que creo que usa clang para compilación. En ffmpeg hay una estructura con una variable miembro llamada 'clase'. Creo que esto está perfectamente bien en C, pero clang está tratando de analizarlo como una palabra clave. Alguna idea de como arreglarlo? Básicamente lo siguiente en un archivo CPP hará que el error:Clang C Palabra clave 'clase' compilador?

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

Se trata de interpretar la clase como una palabra clave.

FYI el archivo que arroja el error en ffmpeg es libavcodec/mpegvideo.h y necesito incluir esto para tener acceso a la estructura MpegEncContext para extraer la información del mapa de movimiento.

EDITAR

El ejemplo de código anterior fue sólo para demostrar el error. Pero tal vez se puede arreglar de otra manera. En mi código real que tengo de esta manera:

#ifdef __cplusplus 
extern "C" { 
#endif 

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

#if __cplusplus 
} //Extern C 
#endif 

¿Cómo voy a conseguir que la inclusión de los dos archivos como archivos de C++ y C no?

Gracias

+0

Y su pregunta relacionada con Xcode- (ffmpeg) es: –

+3

jeje: 'extern COBOL {AGREGAR A A B DANDO C}' – pmg

+0

Mi pregunta relacionada con xcode ffmpeg es, ¿cómo incluir ese encabezado en un archivo C++ y compilarlo en Xcode? – user1689196

Respuesta

4

Está completamente bien en C. Cuando construyes eso como C++, encuentras un error porque class es una palabra clave C++.

En cuanto a la fijación, normalmente elegiría un identificador que no sea class. Sin embargo, los desarrolladores de ffmpeg pueden no estar tan de acuerdo con ese cambio. Por lo tanto, es posible que necesite ya sea:

  • restringir la visibilidad de esa cabecera de C traducciones
  • o editar su propia copia con el fin de utilizarlo en C++ traducciones

Afortunadamente, usted es también utilizando un compilador C que tiene un buen soporte de las características C99 en este caso. C Los compiladores que no son compatibles con C99 son particularmente problemáticos con las fuentes de ffmpeg (porque entonces compilaría todo el programa como C++ para las características de C99, y la cantidad de conflictos sería mucho mayor).

(hay otros trucos sucios que podría hacer para tratar de solucionar el problema, pero no voy a mencionarlos)

+0

¿Puede explicarme un poco más cómo puedo restringir la visibilidad de esos encabezados a las traducciones C? Supongo que podría mover cualquier código que use ese archivo en un archivo .c en su lugar. Pero aún tendría que incluir ese archivo .c de un archivo C++ en algún momento, creo. – user1689196

+0

Supongo que podría renombrar la variable de clase a cualquier otra cosa ya que solo usa el archivo de encabezado para referencia (ffmpeg ya está compilado en una biblioteca) pero simplemente no me gusta meterme con los archivos fuente si no es necesario. hace la actualización un poco más difícil. – user1689196

+1

@ user1689196 seguro. estás en el camino correcto; necesitaría crear una capa delgada (en C) que luego puede invocar desde C++ para interactuar con 'SomeStruct', o simplemente tratar con ese aspecto del programa que incluye' SomeStruct' exclusivamente en una implementación C más grande. – justin

4

Basically the following in a cpp file will cause the error

archivos .cpp se procesan como archivos de C++, no C, y class es una palabra reservada en C++.

+0

pero no debería extern C forzarlo a usar el compilador C? – user1689196

+5

@ user1689196, absolutamente no. Eso solo cambiará la vinculación de los símbolos para detener el cambio de nombre. Puede forzar el idioma utilizando la bandera -x. –

+0

No, 'extern C' solo cambia la forma en que funciona el cambio de nombre. Para compilar como C, use .c – Joe

1

Si no tiene una opción para cambiar el nombre de cualquier cosa en los archivos de cabecera, usted podría reemplazar el token class por otra cosa

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

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

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

Este es un truco sucio, pero por dicho código mal interconectado no tienen mucha elección. La verdadera solución sería tener todos los miembros struct en estos archivos que usen nombres que nos hagan algún tipo de prefijo, como se hace en el código de la capa de red. Allí todos los miembros tienen algunos prefijos como ss_ o sa_ y es muy poco probable que ocurran tales problemas.

+0

este es el truco sucio principal que tenía en mente cuando escribí sobre trucos sucios en mi respuesta :) * (no te preocupes, no voy a menospreciar porque en realidad tomaste la molestia de señalar y explicando el problema, y ​​dejó en claro que está sucio) * – justin