2012-02-02 21 views
14

Estoy creando un protocolo, y uno de los parámetros de un método que estoy definiendo es CMTime*. Me gustaría reenviar declarar CMTime en lugar de incluirlo. Sin embargo, he intentado @class CMTime y se queja de que se redefina en otro lugar como un tipo diferente de símbolo. La documentación dice que es una estructura. He intentado adelante declarar comoReenviar declarar una estructura en Objective-C

struct CMTime; 

pero todavía se queja de que no sabe lo que es.

¿Alguna idea de lo que estoy haciendo mal?

+2

Lamentablemente, se declara utilizando una estructura anónima. Esto significa que debe copiar la declaración completa (y esperar que nunca cambie) o simplemente incluir el encabezado. – ughoavgfhw

+1

@ughoavgfhw copiarlo no es bueno (lo más probable es que ambas declaraciones terminen en la misma TU). Aparte de eso, creo que califica como una respuesta específica, teniendo en cuenta cómo se ha declarado 'CMTime'. – justin

+0

@Justin Solo lo sugerí porque dijo que no iba a incluir el encabezado, pero ahora que lo pienso, estaba recibiendo un error que ya se había definido al intentar crear una clase, lo que sugeriría que encabezado ya estaba incluido. Si alguien puede explicar eso, podría publicarlo como una respuesta. – ughoavgfhw

Respuesta

0

Si desea que los archivos que tienen la declaración forward conozcan los contenidos de la estructura, deberán importar un encabezado (puede estar en varios lugares) donde se define. Usted can reenviar declara una estructura si no necesita acceder a sus propiedades, pero esa es la extensión de la misma.

+0

Me disculpo (necesito aprender a usar google: P) - editando la respuesta ahora. ¿Mi respuesta ahora es correcta? – jrtc27

+0

llegar allí - es más complicado que eso. – justin

17

Una fuente compilada como ObjC tiene las mismas reglas que C en este sentido.

Una fuente compilada como ObjC++ tiene las mismas reglas que C++ a este respecto.

@class MONClass; es una declaración directa de tipo ObjC. No lo use para estructuras.

struct t_mon_struct; es una declaración directa de llamada C o C++ struct. No lo use para tipos ObjC. Técnicamente, el compilador le permite también reenviar declarar una clase de C++ como una estructura (siempre que, por supuesto, la clase también se declare en el espacio de nombres global).

Por lo tanto, la raíz de la semántica se reduce a C (suponiendo que se trata de una traducción de ObjC). Dejaré de mencionar ObjC y C++ ahora.

Hay algunas fuentes comunes de complejidad aquí:

  • el espacio de nombres estructura
  • la declaración de la estructura
  • evitando múltiples definiciones de etiquetas

struct t_mon_struct; es una declaración adelantada de un etiquetado estructura Específicamente, ese es el nombre que existe en el espacio de nombres de la estructura.

una estructura marcada que existe en el espacio de nombres estructura:

struct t_mon_struct { int a; }; 

una estructura anónima con un typedef en el espacio de nombres global:

typedef struct { int a; } t_mon_struct; 

una estructura etiquetados con un typedef en el espacio de nombres global:

typedef struct t_mon_struct { int a; } t_mon_struct; 

CMTime se declara como sigue:

typedef struct 
{ 
    CMTimeValue value; 
    CMTimeScale timescale; 
    CMTimeFlags flags; 
    CMTimeEpoch epoch; 
} CMTime; 

En concreto, la etiqueta typedef mundial CMTime está unido a una estructura anónima en el espacio de nombres de estructura, y no puede ser referenciado a menos que su declaración es visible.

De haber sido declarado CMTime:

typedef struct CMTime 
{ 
    CMTimeValue value; 
    CMTimeScale timescale; 
    CMTimeFlags flags; 
    CMTimeEpoch epoch; 
} CMTime; 

entonces usted podría haber conseguido mediante el uso de una declaración hacia adelante struct CMTime:

struct CMTime; 
void foo(struct CMTime*); 

Dado que no fue declarado de esa manera, tendrá que #include su declaración, o idear una solución alternativa.

Las complicaciones empeoran cuando el typedef de la estructura es distinto de su etiqueta. No puede enlazar o redeclarar un typedef (en C). Sin embargo, puede escabullirse utilizando el nombre en el espacio de nombres de la estructura, que algunos autores de la biblioteca consideran como privado.

1

Simplemente agregando typedef antes de que la estructura me solucione el problema.

typedef struct CMTime; 
Cuestiones relacionadas