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.
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
@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
@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